您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Java中任意集的笛卡尔积

Java中任意集的笛卡尔积

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

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

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 2022/1/1 18:21:44 有434人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶