I want to compute the cartesian product of an arbitrary number of nonempty sets in Java.
I\'ve wrote that iterative code...
public s
I believe this is correct. It is not seeking efficiency, but a clean style through recursion and abstraction.
The key abstraction is to introduce a simple Tuple
class. This helps the generics later:
class Tuple {
private List list = new ArrayList();
public void add(T t) { list.add(t); }
public void addAll(Tuple subT) {
for (T t : subT.list) {
list.add(t);
}
}
public String toString() {
String result = "(";
for (T t : list) { result += t + ", "; }
result = result.substring(0, result.length() - 2);
result += " )";
return result;
}
}
With this class, we can write a class like so:
public class Example {
public static List> cartesianProduct(List> sets) {
List> tuples = new ArrayList>();
if (sets.size() == 1) {
Set set = sets.get(0);
for (T t : set) {
Tuple tuple = new Tuple();
tuple.add(t);
tuples.add(tuple);
}
} else {
Set set = sets.remove(0);
List> subTuples = cartesianProduct(sets);
System.out.println("TRACER size = " + tuples.size());
for (Tuple subTuple : subTuples) {
for (T t : set) {
Tuple tuple = new Tuple();
tuple.addAll(subTuple);
tuple.add(t);
tuples.add(tuple);
}
}
}
return tuples;
}
}
I have a decent example of this working, but it is omitted for brevity.