gpt4 book ai didi

java - 根据使用 Java 8 流的元素之间的差异拆分数字的有序列表多个列表

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:02:54 25 4
gpt4 key购买 nike

第一次在这里提问所以请放轻松。 :) 无论如何,我不确定使用 Java 8 流是否可行,但我对学习非常感兴趣。

假设我有以下有序的数字列表:

List<Integer> myList = Arrays.asList(1, 2, 3, 7, 9, 12, 13, 15);

现在,当元素之间的差异大于 2 时,我想将此列表拆分为多个列表。因此,最终结果将是三个不同的列表:

{1, 2, 3}
{7, 9}
{12, 13, 15}

我可以使用 for 循环轻松完成此练习,并在循环时将当前元素与前一个元素进行比较。但是,我想知道是否有一种简洁的方法可以使用 Java 8 流来完成此操作?就像我之前说的,这只是为了我自己对 Java 8 的学习和理解,所以如果不可能,那也没关系。

提前感谢您的任何评论或回答。

最佳答案

好吧,我只能想到自定义收集器,因为您需要一些先前的状态,但这还不够简洁(除非您将其隐藏在方法后面):

 private static <T> Collector<Integer, ?, List<List<Integer>>> diffCollector() {

class Acc {

private Integer previous;

private List<List<Integer>> result = new ArrayList<>();

void accumulate(Integer elem) {
if (previous == null) {
previous = elem;
List<Integer> list = new ArrayList<>();
list.add(previous);
result.add(list);
return;
}

if (elem - previous > 2) {
List<Integer> oneMore = new ArrayList<>();
oneMore.add(elem);
result.add(oneMore);
previous = elem;
} else {
result.get(result.size() - 1).add(elem);
previous = elem;
}
}

Acc combine(Acc other) {

throw new UnsupportedOperationException("Not for parallel");
}

List<List<Integer>> finisher() {
return result;
}

}
return Collector.of(Acc::new, Acc::accumulate, Acc::combine, Acc::finisher);
}

用法是:

 List<Integer> myList = Arrays.asList(1, 2, 3, 7, 9, 12, 13, 15);
System.out.println(myList.stream().collect(diffCollector()));

关于java - 根据使用 Java 8 流的元素之间的差异拆分数字的有序列表多个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45941328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com