编辑:删除两组的以前的解决方案。有关详情,请参阅编辑历史记录。
这里是递归地对任意数量的集合做一个方法:
public static Set> cartesianProduct(Set>... sets) {
if (sets.length < 2)
throw new IllegalArgumentException(
"Can't have a product of fewer than two sets (got " +
sets.length + ")");
return _cartesianProduct(0, sets);
}
private static Set> _cartesianProduct(int index, Set>... sets) {
Set> ret = new HashSet>();
if (index == sets.length) {
ret.add(new HashSet());
} else {
for (Object obj : sets[index]) {
for (Set set : _cartesianProduct(index+1, sets)) {
set.add(obj);
ret.add(set);
}
}
}
return ret;
}
请注意,不可能使用返回的集保留任何通用类型信息。如果事先知道要获得多少个集合,则可以定义一个通用元组来保存许多元素(例如Triple< A,B,C>),但是没有办法得到任意数的通用参数。