【问题标题】:Splitting a list to sublists containing equal numbers将列表拆分为包含相等数字的子列表
【发布时间】:2017-09-28 19:09:45
【问题描述】:

我正在寻找功能性的 java 8 解决方案,以解决将数组拆分为包含相等元素的子列表的问题;

即:

ArrayList.asList(1,2,2,3,4,4,4) -->  List([1],[2,2],[3], [4,4,4])

到目前为止,我只找到了计算这些元素的解决方案:

Map<Integer,Integer> count = lst.stream().collect(Collectors.groupingBy(s -> s, Collectors.counting()));

导致count-value的映射,不够好。

很高兴收到一些提示,我想我确实需要先以某种方式映射,然后获取 entrySet;

【问题讨论】:

标签: java arrays functional-programming java-8 java-stream


【解决方案1】:
List<List<Integer>> list = Arrays.asList(1,2,2,3,4,4,4).stream()
    // grouping gets you a Map<Integer,List<Integer>>
    .collect(Collectors.groupingBy(s -> s)) 
    // take the values of this map and create of stream of these List<Integer>s
    .values().stream()   
    // collect them into a List
    .collect(Collectors.toList());   

打印结果为您提供请求的列表列表:

System.out.println(list);

[1, [2, 2], [3], [4, 4, 4]]


编辑:感谢Alexis C. 这个替代方案:

Arrays.asList(1,2,2,3,4,4,4).stream()
   .collect(collectingAndThen(groupingBy(s -> s), m -> new ArrayList<>(m.values())));

【讨论】:

  • 如果您期望如此,我的回答确实行不通。但就问题本身而言,似乎没问题。
  • 是的,问题是根据它们的相等性对列表中的所有整数进行分组;答案很完美,非常感谢!
  • 你冷也用collectingAndThen:list.stream().collect(collectingAndThen(groupingBy(s -&gt; s), m -&gt; new ArrayList&lt;&gt;(m.values())));
  • 这也是一个不错的解决方案@AlexisC。!从地图中流式传输值的简洁替代品。
猜你喜欢
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 2019-03-28
  • 2021-10-04
相关资源
最近更新 更多