import java.util.List;
import java.util.LinkedList;
import java.util.Arrays;
public class Main {
public static void main
(String[] args
) { List
<List
<String
>> input
= Arrays.
asList( Arrays.
asList("London",
"Liverpool"),
Arrays.
asList("DG300",
"SS500") );
for (List<String> output : combinations(input)) {
}
}
// combinations :: [[String]] -> [[String]]
public static List<List<String>> combinations(List<List<String>> values) {
// combinations [] = [[]]
if (values.isEmpty()) {
}
// combinations (x:xs) =
List<String> x = values.get(0);
List<List<String>> xs = values.subList(1, values.size());
// do
List<List<String>> outputs = new LinkedList<>();
// ys <- combinations xs
for (List<String> ys : combinations(xs)) {
// y <- x
// (y:ys)
List<String> output = new LinkedList<>();
output.add(y);
output.addAll(ys);
// return
outputs.add(output);
}
}
return outputs;
}
}
aW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwoKcHVibGljIGNsYXNzIE1haW4gewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKCQlMaXN0PExpc3Q8U3RyaW5nPj4gaW5wdXQgPSBBcnJheXMuYXNMaXN0KAoJCQlBcnJheXMuYXNMaXN0KCJFbmdsYW5kIiksCgkJCUFycmF5cy5hc0xpc3QoIkxvbmRvbiIsICJMaXZlcnBvb2wiKSwKCQkJQXJyYXlzLmFzTGlzdCgiREczMDAiLCAiU1M1MDAiKQoJCSk7CgkJCgkJZm9yIChMaXN0PFN0cmluZz4gb3V0cHV0IDogY29tYmluYXRpb25zKGlucHV0KSkgewoJCQlTeXN0ZW0ub3V0LnByaW50bG4ob3V0cHV0KTsKCQl9Cgl9CgkKCS8vIGNvbWJpbmF0aW9ucyA6OiBbW1N0cmluZ11dIC0+IFtbU3RyaW5nXV0KCXB1YmxpYyBzdGF0aWMgTGlzdDxMaXN0PFN0cmluZz4+IGNvbWJpbmF0aW9ucyhMaXN0PExpc3Q8U3RyaW5nPj4gdmFsdWVzKSB7CgkKCSAgICAvLyBjb21iaW5hdGlvbnMgW10gPSBbW11dCgkgICAgaWYgKHZhbHVlcy5pc0VtcHR5KCkpIHsKCSAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoQXJyYXlzLmFzTGlzdCgpKTsKCSAgICB9CgkKCSAgICAvLyBjb21iaW5hdGlvbnMgKHg6eHMpID0KCSAgICBMaXN0PFN0cmluZz4gICAgICAgeCAgPSB2YWx1ZXMuZ2V0KDApOwoJICAgIExpc3Q8TGlzdDxTdHJpbmc+PiB4cyA9IHZhbHVlcy5zdWJMaXN0KDEsIHZhbHVlcy5zaXplKCkpOwoJCgkgICAgLy8gZG8KCSAgICBMaXN0PExpc3Q8U3RyaW5nPj4gb3V0cHV0cyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKCQoJICAgIC8vIHlzIDwtIGNvbWJpbmF0aW9ucyB4cwoJICAgIGZvciAoTGlzdDxTdHJpbmc+IHlzIDogY29tYmluYXRpb25zKHhzKSkgewoJCgkgICAgICAgIC8vIHkgPC0geAoJICAgICAgICBmb3IgKFN0cmluZyB5IDogeCkgewoJCgkgICAgICAgICAgICAvLyAoeTp5cykKCSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBvdXRwdXQgPSBuZXcgTGlua2VkTGlzdDw+KCk7CgkgICAgICAgICAgICBvdXRwdXQuYWRkKHkpOwoJICAgICAgICAgICAgb3V0cHV0LmFkZEFsbCh5cyk7CgkKCSAgICAgICAgICAgIC8vIHJldHVybgoJICAgICAgICAgICAgb3V0cHV0cy5hZGQob3V0cHV0KTsKCSAgICAgICAgfQoJICAgIH0KCQoJICAgIHJldHVybiBvdXRwdXRzOwoJfQp9
[England, London, DG300]
[England, Liverpool, DG300]
[England, London, SS500]
[England, Liverpool, SS500]