Java中任意集的笛卡尔积

你是否知道一些精巧的Java库,可让你制作两个(或更多)集合的笛卡尔积

例如:我有三套。一个对象是Person类的对象,第二个对象是Gift的对象,第三个对象是GiftExtension的对象。

我想生成一个包含所有可能的三元组Person-Gift-GiftExtension的集合。

集的数量可能会有所不同,因此我无法在嵌套的foreach循环中执行此操作。在某些情况下,我的应用程序需要制作Person-Gift对的乘积,有时是Person-Gift-GiftExtension的三乘,有时甚至可能会设置Person-Gift-GiftExtension-GiftSecondExtension-GiftThirdExtension等。

回答:

编辑:删除了两组的以前的解决方案。有关详细信息,请参见编辑历史记录。

这是一种对任意数量的集合进行递归处理的方法:

public static Set<Set<Object>> 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<Set<Object>> _cartesianProduct(int index, Set<?>... sets) {

Set<Set<Object>> ret = new HashSet<Set<Object>>();

if (index == sets.length) {

ret.add(new HashSet<Object>());

} else {

for (Object obj : sets[index]) {

for (Set<Object> set : _cartesianProduct(index+1, sets)) {

set.add(obj);

ret.add(set);

}

}

}

return ret;

}

请注意,不可能将任何通用类型信息与返回的集一起保留。如果你事先知道要使用多少个集合,则可以定义一个通用元组来容纳那么多元素(例如Triple<A, B, C>),但是在Java中无法拥有任意数量的通用参数。

以上是 Java中任意集的笛卡尔积 的全部内容, 来源链接: utcz.com/qa/421553.html

回到顶部