/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
List<List<String>> combList = new ArrayList<>();
combList.
add(Arrays.
asList("a1",
"a2",
"a3")); combList.
add(Arrays.
asList("b1",
"b2")); combList.
add(Arrays.
asList()); combList.
add(Arrays.
asList("c1",
"c2",
"c3"));
combinations(combList, 0, 0, "");
}
public static void combinations
(List
<List
<String
>> combList,
int listIndex,
int itemIndex,
String result
) {
// Am I at the bottom of the y-axis?
if(listIndex < combList.size())
{
//Am I at the bottom of the x-axis?
if(itemIndex < combList.get(listIndex).size())
{
List<String> curList = combList.get(listIndex);
StringBuilder sb = new StringBuilder();
sb.append(result).append(curList.get(itemIndex)).append(" ");
combinations(combList, listIndex + 1, 0, sb.toString());
combinations(combList, listIndex, itemIndex + 1, result);
}else if (combList.get(listIndex).isEmpty()){
combinations(combList, listIndex + 1, 0, result);
}
return;
}
//return; - redundant as last instruction of method
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJICAgIExpc3Q8TGlzdDxTdHJpbmc+PiBjb21iTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwoJICAgIGNvbWJMaXN0LmFkZChBcnJheXMuYXNMaXN0KCJhMSIsICJhMiIsICJhMyIpKTsKCSAgICBjb21iTGlzdC5hZGQoQXJyYXlzLmFzTGlzdCgiYjEiLCAiYjIiKSk7CgkgICAgY29tYkxpc3QuYWRkKEFycmF5cy5hc0xpc3QoKSk7CgkgICAgY29tYkxpc3QuYWRkKEFycmF5cy5hc0xpc3QoImMxIiwgImMyIiwgImMzIikpOwoJCgkgICAgY29tYmluYXRpb25zKGNvbWJMaXN0LCAwLCAwLCAiIik7Cgl9CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21iaW5hdGlvbnMoTGlzdDxMaXN0PFN0cmluZz4+IGNvbWJMaXN0LCBpbnQgbGlzdEluZGV4LCBpbnQgaXRlbUluZGV4LCBTdHJpbmcgcmVzdWx0KQoJewoJICAgIC8vIEFtIEkgYXQgdGhlIGJvdHRvbSBvZiB0aGUgeS1heGlzPwoJICAgIGlmKGxpc3RJbmRleCA8IGNvbWJMaXN0LnNpemUoKSkKCSAgICB7CgkgICAgICAgIC8vQW0gSSBhdCB0aGUgYm90dG9tIG9mIHRoZSB4LWF4aXM/CgkgICAgICAgIGlmKGl0ZW1JbmRleCA8IGNvbWJMaXN0LmdldChsaXN0SW5kZXgpLnNpemUoKSkKCSAgICAgICAgewoJICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGN1ckxpc3QgPSBjb21iTGlzdC5nZXQobGlzdEluZGV4KTsKCSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwoJICAgICAgICAgICAgc2IuYXBwZW5kKHJlc3VsdCkuYXBwZW5kKGN1ckxpc3QuZ2V0KGl0ZW1JbmRleCkpLmFwcGVuZCgiICIpOwoJICAgICAgICAgICAgY29tYmluYXRpb25zKGNvbWJMaXN0LCBsaXN0SW5kZXggKyAxLCAwLCBzYi50b1N0cmluZygpKTsKCSAgICAgICAgICAgIGNvbWJpbmF0aW9ucyhjb21iTGlzdCwgbGlzdEluZGV4LCBpdGVtSW5kZXggKyAxLCByZXN1bHQpOwoJICAgICAgICB9ZWxzZSBpZiAoY29tYkxpc3QuZ2V0KGxpc3RJbmRleCkuaXNFbXB0eSgpKXsKCSAgICAgICAgICAgIGNvbWJpbmF0aW9ucyhjb21iTGlzdCwgbGlzdEluZGV4ICsgMSwgMCwgcmVzdWx0KTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm47CgkgICAgfQoJICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQpOwoJICAgIC8vcmV0dXJuOyAtIHJlZHVuZGFudCBhcyBsYXN0IGluc3RydWN0aW9uIG9mIG1ldGhvZAoJfQp9