任意数量集合的笛卡尔积

62

你知道一些很好的Java库,可以让你生成两个(或更多)集合的笛卡尔积吗?

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

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

集合的数量可能会有所变化,因此我不能在嵌套的foreach循环中执行此操作。 在某些条件下,我的应用程序需要生成Person-Gift对的乘积,有时是三元组Person-Gift-GiftExtension,有时甚至可能是集合Person-Gift-GiftExtension-GiftSecondExtension-GiftThirdExtension等。

11个回答

-1
你可以通过这个应用一个名为Seq的简单生成器接口。与Guava的cartesianProduct不同,集合/列表/可迭代对象不需要在相同的泛型类型边界B内,所有类型都可以。你所需要做的就是像正常嵌套for循环一样编写乘积即可。
public static void main(String[] args) {
    List<String> ls1 = Arrays.asList("a", "b");
    List<Integer> ls2 = Arrays.asList(1, 2);
    List<Character> ls3 = Arrays.asList('x', 'y');

    Seq<String> seq = c -> {
        for (String s : ls1) {
            for (Integer i : ls2) {
                for (Character d : ls3) {
                    c.accept(s + i + d);
                }
            }
        }
    };

    System.out.println(seq.toSet());
}

结果将会是:

[a2x, a1y, b1x, b2y, a1x, a2y, b2x, b1y]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接