Iterative Cartesian Product in Java
I've written a solution that doesn't require you to fill up a large collection in memory. Unfortunately, the code required is hundreds of lines long. You may have to wait until it appears in the Guava project (https://github.com/google/guava), which I hope will be by the end of the year. Sorry. :(
Note that you may not need such a utility if the number of sets you're cartesian-producting is a fixed number known at compile time -- you could just use that number of nested for loops.
EDIT: the code is released now.
Sets.cartesianProduct()
I think you'll be very happy with it. It only creates the individual lists as you ask for them; doesn't fill up memory with all MxNxPxQ of them.
If you want to inspect the source, it's here.
Enjoy!
Using Google Guava 19 and Java 8 is very simple:
Say you have the List of all arrays you want to associate...
public static void main(String[] args) {
List<String[]> elements = Arrays.asList(
new String[]{"John", "Mary"},
new String[]{"Eats", "Works", "Plays"},
new String[]{"Food", "Computer", "Guitar"}
);
// Create a list of immutableLists of strings
List<ImmutableList<String>> immutableElements = makeListofImmutable(elements);
// Use Guava's Lists.cartesianProduct, since Guava 19
List<List<String>> cartesianProduct = Lists.cartesianProduct(immutableElements);
System.out.println(cartesianProduct);
}
The method to make the list of immutable lists is as follows:
/**
* @param values the list of all profiles provided by the client in matrix.json
* @return the list of ImmutableList to compute the Cartesian product of values
*/
private static List<ImmutableList<String>> makeListofImmutable(List<String[]> values) {
List<ImmutableList<String>> converted = new LinkedList<>();
values.forEach(array -> {
converted.add(ImmutableList.copyOf(array));
});
return converted;
}
The output is as follows:
[
[John, Eats, Food], [John, Eats, Computer], [John, Eats, Guitar],
[John, Works, Food], [John, Works, Computer], [John, Works, Guitar],
[John, Plays, Food], [John, Plays, Computer], [John, Plays, Guitar],
[Mary, Eats, Food], [Mary, Eats, Computer], [Mary, Eats, Guitar],
[Mary, Works, Food], [Mary, Works, Computer], [Mary, Works, Guitar],
[Mary, Plays, Food], [Mary, Plays, Computer], [Mary, Plays, Guitar]
]