java - 如何生成 List<List<String>> 的所有排列?

标签 java java-stream

我正在尝试生成 List<List<String>> 的所有排列但我没有得到独特的排列。

我的List<List<String>>看起来像

[
 [Test, Test 1, Test 2],
 [Apple, Sandwich, Banana],
 [Cake, Ice Cream, Fruit]
] 

我正在尝试为每个 List<String 获取所有可能的组合在父级内List<String> 。因此,例如,第一个实例应该具有:

[Test, Test 1, Test 2]
[Test, Test 2, Test 1]
[Test 2, Test, Test 1]
[Test 2, Test 1, Test]
[Test 1, Test, Test 2]
[Test 1, Test 2, Test]

现在,我的尝试只是迭代并重复元素而不改变顺序,所以 [Test, Test 1, Test 2]只会重复父项 List<String> 的大小。这是我的方法。感谢任何帮助:

List<List<String>> allPerms = parentList.stream().map(line -> parentList.stream()).flatMap(l -> l.filter(j -> !j.equals(l))).collect(Collectors.toList());

最佳答案

使用CollectionUtils.permutations

public static void showAllPermuteByCommons(List<String> list) {
    CollectionUtils.permutations(list) //
            .stream() //
            .forEach(System.out::println);
}

或者原路返回

public static void permute(List<String> list, int left, int right) {
    if (left == right) {
        System.out.println(Arrays.toString(list.toArray()));
        return;
    }
    for (int j = left; j <= right; j++) {
        Collections.swap(list, left, j);
        permute(list, left + 1, right);
        Collections.swap(list, left, j);
    }
}

public static void showAllPermute(List<String> list) {
    int size = list.size();
    permute(list, 0, size - 1);
}

测试

List<List<String>> list = new ArrayList<>();
list.add(Arrays.asList("Test", "Test 1", "Test 2"));
list.add(Arrays.asList("Apple", "Sandwich", "Banana"));
list.add(Arrays.asList("Cake", "Ice Cream", "Fruit"));

// list.forEach(t -> showAllPermuteByCommons(t));
list.forEach(t -> showAllPermute(t));

输出

[Test, Test 1, Test 2]
[Test, Test 2, Test 1]
[Test 2, Test, Test 1]
[Test 2, Test 1, Test]
[Test 1, Test 2, Test]
[Test 1, Test, Test 2]
[Apple, Sandwich, Banana]
[Apple, Banana, Sandwich]
[Banana, Apple, Sandwich]
[Banana, Sandwich, Apple]
[Sandwich, Banana, Apple]
[Sandwich, Apple, Banana]
[Cake, Ice Cream, Fruit]
[Cake, Fruit, Ice Cream]
[Fruit, Cake, Ice Cream]
[Fruit, Ice Cream, Cake]
[Ice Cream, Fruit, Cake]
[Ice Cream, Cake, Fruit]

关于java - 如何生成 List<List<String>> 的所有排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58314196/

相关文章:

java - 使用servlet通过html页面更新数据库记录

java - 当满足特定条件时,是否可以在 Java Stream 中使用谓词?

java - 如何将 List<Person> 转换为 Map<String, List<Double>> 而不是 Map<String, List<Person>>?

Java 8 : Find index of minimum value from a List

java - 处理 Lambda 表达式中的异常

foreach - 为什么我使用 foreach 总是得到 ArrayIndexOutOfBoundsException

java - 在 Tomcat 8.5 上找不到 liquibase.logging.Logger 的实现

java - 将 Tomcat 7 升级到 64 位 JVM

java - 使用 GLSurfaceView 的操作方法和理解拖动和缩放事件

java - 为什么使用 Yeoman 的生成器而不是 Maven 的原型(prototype)?