CartesianProductSolver.java
package edu.udel.cis.vsl.civl.util.IF;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class CartesianProductSolver<T> implements Iterable<List<T>> {
private List<List<T>> results;
public CartesianProductSolver(List<List<T>> args) {
int numSets = args.size();
if (numSets <= 0)
results = new LinkedList<>();
else {
results = new LinkedList<>();
results.add(new LinkedList<>());
for (List<T> vector : args)
results = vectorSetProd(vector, results);
}
}
/**
* The cartesian product of a vector T[] v AND a set of vectors
* List-of-List-of-T s:
*/
private List<List<T>> vectorSetProd(List<T> vector, List<List<T>> set) {
List<List<T>> newSet = new LinkedList<>();
for (List<T> vec : set) {
for (T e : vector) {
List<T> newVec = new LinkedList<>(vec);
newVec.add(e);
newSet.add(newVec);
}
}
return newSet;
}
@Override
public Iterator<List<T>> iterator() {
return results.iterator();
}
}