我想计算Java中任意数量的非空集的笛卡尔乘积.
我写了这个迭代代码…
public static List> cartesianProduct(List> list) {
List> iterators = new ArrayList>(list.size());
List elements = new ArrayList(list.size());
List> toRet = new ArrayList>();
for (int i = 0; i < list.size(); i++) {
iterators.add(list.get(i).iterator());
elements.add(iterators.get(i).next());
}
for (int j = 1; j >= 0;) {
toRet.add(Sets.newHashSet(elements));
for (j = iterators.size()-1; j >= 0 && !iterators.get(j).hasNext(); j--) {
iterators.set(j, list.get(j).iterator());
elements.set(j, iterators.get(j).next());
}
elements.set(Math.abs(j), iterators.get(Math.abs(j)).next());
}
return toRet;
}
…但我发现它相当不雅.
有人有更好的,仍然是迭代的解决方案?一种使用一些奇妙功能的方法的解决方案?
否则…建议如何改进?错误?