使用java流API检查列表元素是否是连续的整数范围



给定var ns = List.of(1,2,3,4)如何使用java流API 检查列表元素是否连续

可以使用以下循环完成:

for (var i = 1; i <= ns.size() - 1; i++) {
if (ns.get(i) - ns.get(i - 1) != 1)
return false;
}
return true;

如何使用ns.stream.reduce或其他流方法来完成?

有很多方法可以解决这个问题,我想创建一个有序列表,并将其与初始列表进行比较,例如:

List<Integer> ints = IntStream.iterate(ns.get(0), i -> i + 1)
.limit(ns.size()).boxed()
.collect(Collectors.toList());
return ns.equals(ints);

或者你也可以使用:

AtomicInteger ai = new AtomicInteger(); // used to generate indexes(0, 1, 2...)
return IntStream.iterate(ns.get(0), i -> i + 1)
.limit(ns.size())
.allMatch(i -> i == ns.get(ai.getAndIncrement()));

您可以通过映射列表中两个相邻元素之间的差异来处理此问题,如果任何差异不等于1,则这不是连续列表。其中一种方法是这个

final var ns = List.of(1, 2, 3, 4);
IntStream.range(0, ns.size() - 1)
.mapToLong(operand -> ns.get(operand + 1) - ns.get(operand))
.anyMatch(value -> value != 1);

尽管您没有提到输入列表可以按升序或降序连续,但以下代码可以用于使用Collectors.reducing处理这两种情况。(可能不如@YCF_L的解决方案最佳(

AtomicInteger i = new AtomicInteger(list.get(0));
Function<AtomicInteger, Integer> f = a -> (list.get(0) < list.get(1)) 
? i.getAndIncrement()
: i.getAndDecrement();
return list.stream()
.collect(Collectors.groupingBy(Function.identity(),
Collectors.reducing(0, (a, b) -> b - f.apply(i))))
.values()
.stream()
.allMatch(n -> n == 0);

相关内容

最新更新