gpt4 book ai didi

java - 任意数量集合的笛卡尔积

转载 作者:IT老高 更新时间:2023-10-28 20:42:04 26 4
gpt4 key购买 nike

您知道一些简洁的 Java 库,它们可以让您制作两个(或更多)集合的笛卡尔积吗?

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

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

集合的数量可能会有所不同,因此我无法在嵌套的 foreach 循环中执行此操作。在某些情况下,我的应用程序需要制作 Person-Gift pair 的乘积,有时它是三重 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 - 任意数量集合的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/714108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com