如何用Java生成笛卡尔积?

dev*_*nai 8 java cartesian-product

我有一些ArrayList每个ArrayList都有对象,每个可以有不同的长度.我需要生成排列,如下例所示:

假设我有2个arraylist

arraylist A有对象a,对象b和对象c
arraylist B有对象d,对象e

那么输出应该是6个新的arraylist与这个组合:

组合1对象a和对象d,
组合2对象a和对象e,
组合3对象b和对象d,
组合4对象b和对象e,
组合5对象c和对象d,
组合6对象c和对象e,

谁能帮我?

ROM*_*eer 6

番石榴19+

Lists.cartesianProduct(List...)
Run Code Online (Sandbox Code Playgroud)

例如:

List<Object> list1 = Arrays.asList("a", "b", "c");
List<Object> list2 = Arrays.asList("d", "e");
System.out.println(Lists.cartesianProduct(list1, list2));
Run Code Online (Sandbox Code Playgroud)

输出:

[[a, d], [a, e], [b, d], [b, e], [c, d], [c, e]]
Run Code Online (Sandbox Code Playgroud)


Sar*_*ana 5

随着Java8溪流

    List<String> a = Arrays.asList("a", "b", "c");
    List<String> b = Arrays.asList("d", "e");
    String[][] AB = a.stream().flatMap(ai -> b.stream().map(bi -> new String[] { ai, bi })).toArray(String[][]::new);
    System.out.println(Arrays.deepToString(AB));
Run Code Online (Sandbox Code Playgroud)

产量

    [[a, d], [a, e], [b, d], [b, e], [c, d], [c, e]]
Run Code Online (Sandbox Code Playgroud)

得到的 List

    List<List<String>> ll = a.stream().flatMap(ai -> b.stream().map(bi -> new ArrayList<>(Arrays.asList(ai, bi)))).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)


Dro*_*ona 0

使用嵌套的for循环,每个 ArrayList 都有一个循环,如下所示。我假设我有两个 ArrayList - intList 和 stringList。我可以有两个嵌套的for循环(每个列表一个)来生成排列。

for (Integer i : intList) {
    for (String s : stringList) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)