当前位置: 首页 > 知识库问答 >
问题:

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

吕霄
2023-03-14

第一次在这里提问,所以请对我宽容一点。:)无论如何,我不确定这是否可能使用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所以如果这是不可能的,那也没关系。

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

共有1个答案

公孙和怡
2023-03-14

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

 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()));
 类似资料:
  • 我对流完全陌生,目前正在尝试解决这个任务,我有以下两个列表:

  • 问题内容: 我正在寻找一种最有效的方法,根据序列中缺少的数字将数字列表分成较小的列表。例如,如果初始列表为: 该函数将产生: 要么 会导致: 问题答案: 旧Python文档中的Python 3版本代码: 每当关键函数更改其返回值时,itertools模块中的函数都会生成中断。诀窍在于,返回值是列表中的数字减去列表中元素的位置。当数字中有空格时,此差异会更改。 该功能来自operator模块,您必须

  • 问题内容: 给定一个数字列表,人们如何发现第()个元素与其第()个元素之间的差异? 使用表达式还是列表理解更好? 例如: 给定一个列表,我们的目标是要找到一个列表,因为,等等。 问题答案:

  • 可能重复: 原始数组与ArrayList 在java中,列表和数组有什么区别?或数组和矢量之间的区别!

  • 我有一个具体的问题。也有一些类似的问题,但这些问题要么与Python有关,而不是与Java有关,要么即使问题听起来类似,需求也不同。 我有一份价值观清单。 最后,我想根据列表的值对列表进行拆分。我的意思是,如果值大于零,它将保留在原始列表中,负值列表中的相应索引将设置为零。如果该值小于零,它将转到负值列表,原始列表中的负值将替换为零。 结果列表应该是这样的; 有没有办法解决这个流api在Java?