如何使用Java流制作列表元素的所有变体?

马阿德马阿德

我有一个列表,例如:

["a", "b", "c"]

我想创建一个列表列表,该列表将成为该列表元素的变体。结果应该是这样的:

[["a"], 
 ["b"], 
 ["c"], 
 ["a", "b"], 
 ["a", "c"], 
 ["b", "a"], 
 ["b", "c"], 
 ["c", "a"], 
 ["c", "b"], 
 ["a", "b", "c"], 
 ["a", "c", "b"], 
 ["b", "a", "c"], 
 ["b", "c", "a"], 
 ["c", "a", "b"], 
 ["c", "b", "a"]]

如果解决方案将使用Java流,则最好(但不是必需)。

我正在尝试这样的事情:

List<List<String>> lists = IntStream.rangeClosed(1, list.size()) //size of sublist
.flatMap(i -> list.subList(0, i).stream()).collect(Collectors.toList())

但它不起作用。

约尼

您需要做的是利用k置换。您需要对要传递的数组的每个长度执行此k置换,以获取所有可能的变化。

代码

private static List<List<String>> getAllVariations(List<String> elements){
    return IntStream.rangeClosed(1, elements.size()).boxed()
            .flatMap(i-> kPermutate(elements,0,i).stream())
            .collect(Collectors.toList());
}

private static List<List<String>> kPermutate(List<String> allElements, int i, int numberOfElements)
{
    if(i == numberOfElements)
    {
        //New ArrayList because we want a clone of the sublist
        return Arrays.asList(new ArrayList<>(allElements.subList(0, numberOfElements)));
    }
    List<List<String>> tempResult = new ArrayList<>();

    for(int j=i; j<allElements.size(); j++)
    {
        Collections.swap(allElements, i, j);
        tempResult.addAll(kPermutate(allElements, i+1, numberOfElements));
        Collections.swap(allElements, i, j);
    }
    return tempResult;
}

测试:

public static void main(String[] args) {
    List<String> elements = Arrays.asList("a", "b", "c");

    List<List<String>> result = getAllVariations(elements);

    System.out.println(result);
}

输出:

[[a], [b], [c], [a, b], [a, c], [b, a], [b, c], [c, b], [c, a], [a, b, c], [a, c, b], [b, a, c], [b, c, a], [c, b, a], [c, a, b]]

如果您不想在getAllVariations方法中使用流,则也可以将其实现为常规的for循环,例如:

private static List<List<String>> getAllVariations(List<String> elements){
    List<List<String>> result = new ArrayList<>();
    //Start from 1 because we don't want to include [] in the list.
    //i<=elements.size(): we use <= because we want the max number of permutations. this is not a 0 based index for that
    for(int i=1;i<=elements.size();i++){
        result.addAll(kPermutate(elements,0,i));
    }
    return result;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Java 8和流将属性值从列表的第一个元素传播到所有列表元素?

如何使用流减少保留所有列表列表

如何使用 Java 流來創建在嵌套集合的所有元素中迭代的數組?

使用Java流,如何过滤集合,使结果包含所有元素,直到找到匹配项?

Java - 使用流获取具有特定属性的列表元素

如何获得元素为零或一的数组的所有变体

如何使用Java中的流子列表组数元素

如何使用 Java 8 流从列表中过滤元素?

Java列表流,获取所有元素还是仅一个?

如何使用Java 8中的lambda和流检查整数类型的所有元素是否在给定范围内?

获取列表列表并生成替换一个元素的所有变体

如何使用合并元素制作嵌套列表?

如何在Java中检索lexeme的所有变体?

如何找出Elasticsearch在Fuzzysearch中使用的所有变体?

如何通过Java流获得具有最高价值的所有元素?

如何收集与具有特定功能通过Java流现有列表元素的新名单?

Java 8 如何使用流對列表列表中的每個元素求和?

Java 8-如何对列表列表中的所有列表元素求和

使用Java流从List <List <Integer >>中所有对角线元素的总和?

如何将Java8流的元素添加到现有列表中

如何测试列表中的所有元素

如何设置状态列表的所有元素

如何合并列表的所有元素

如何比较列表的所有元素>

如何编译使用流的给定属性的最大值的所有对象的列表?

如何从所有工作区制作Expo列表窗口?

如何制作循环输出的所有实体的单个列表

如何使用Java 8流和Lambda迭代和处理其值是元素列表的地图的值

如何使用Java 8流将列表中的元素映射到其索引?