天天看點

java 笛卡爾積_Java中任意集的笛卡爾積

删除了兩個集合的先前解決方案。有關詳細資訊,請參閱編輯曆史記錄。

這裡有一種方法可以遞歸地對任意數量的集合執行此操作:public static Set> cartesianProduct(Set>... sets) {

if (sets.length 

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),但是在Java中不可能有任意數量的泛型參數。