java - 使用java 8流在排序数字列表中查找最长的连续数字

标签 java java-8 java-stream

我有一段使用传统 for 循环编写的工作代码,如下所示。我想重构它以使用 java 8 流并删除 for 循环。下面代码的输出应该是 3,因为这是最长的连续数字列表(4、5 和 6)

    List<Integer> weekDays = Lists.newArrayList(1, 2, 4, 5, 6);

    List<Integer> consecutiveIntervals = Lists.newArrayList();
    int maxConsecutiveTillNow = 1;
    for (int i = 1; i < weekDays.size(); i++) {
        if (weekDays.get(i) - weekDays.get(i - 1) == 1) {
            maxConsecutiveTillNow++;
        } else {
            consecutiveIntervals.add(maxConsecutiveTillNow);
            maxConsecutiveTillNow = 1;
        }
    }
    consecutiveIntervals.add(maxConsecutiveTillNow);

    System.out.println(consecutiveIntervals.stream()
                                           .max(Integer::compareTo)
                                           .get()
                      );

最佳答案

Stream API 不太适合此类问题。几乎不可能以正确的方式跟踪 Stream 中可见的元素。所以你必须选择多个Streams

基于 Stuart Marks' 之一答案。

List<Integer> weekDays = Arrays.asList(1, 2, 4, 5, 6);
int[] indices = IntStream.rangeClosed(0, weekDays.size())
   .filter(i -> i == 0 || i == weekDays.size() || weekDays.get(i - 1) + 1 != weekDays.get(i))
   .toArray();
int longest = IntStream.range(0, indices.length - 1).map(i -> indices[i + 1] - indices[i])
   .max().orElseThrow(NoSuchElementException::new);
System.out.println(longest);

输出

3

关于java - 使用java 8流在排序数字列表中查找最长的连续数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41344690/

相关文章:

java - 如果使用自定义比较器创建,则为 SortedMap 生成的流的流特征可能无法排序

java - Maven: 包 com.sun.istack.internal 不存在

java - Spring 4 : Java 8 compatibility

java - 如何处理流的流?

java-8 - Spring Reactor 一组集合组合成一个集合

java - Lambda 表达式还是方法引用?

java - 使用来自 java 对象的值从模板动态创建 word 文档

java - 使用 Capistrano 滚动部署 Java/Tomcat 应用程序

java - 分析软件--跟随行动--这叫什么?

java - 为什么这段代码编译失败,原因是类型推断?