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

标签 java set cartesian-product

您知道一些简洁的 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 - 任意数量集合的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37541192/

相关文章:

Java servlet 上传新文件到服务器

java - jsp中的表单内的表单

java - java.util.Set 什么时候检查重复项

batch-file - 设置语法批处理脚本错误

python - 作为字符串列表的集合的所有可能组合

java - Java中n个子数组的取值组合

java - 无法使用 geotools 从 PostGis 查询类型为 double [] 的表

java - 如何为 Spring 数据 JPA REST 启用 Post/Put 方法? ("error 405 : method not allowed")

C++如何生成n维元组的笛卡尔积集

java - 迭代计算任意数量集合的笛卡尔积