繁体   English   中英

为什么我要从偶数 position 上的元素中减去 1? 我只需要奇数位置(奇数索引)Java

[英]Why do I subtract 1 from the element on an even position? I need only odd positions (odd indexes) Java

我需要你的帮助。 我有任务:

  • 给定一个包含 Integer 个数字的列表,返回列表中所有奇数的平均值或抛出 NoSuchElementException。 但在此之前,从奇数 position(具有奇数索引)的每个元素中减去 1。 这是我的解决方案:
return numbers.stream().map(i -> numbers.indexOf(i) % 2 != 0 ? i - 1 : i).filter(i -> i % 2 != 0)
.mapToDouble(Integer::doubleValue).average().orElseThrow(NoSuchElementException::new);

为什么我要从偶数 position 上的元素中减去 1? 我只需要奇数位置(奇数索引)。 这是图片

您的问题出在List#indexOf(Object)上,它总是返回遇到的第一个相等值的索引。

现在您正在处理 stream 中的值,因此减去的值将返回到 stream 中,但不会修改原始numbers列表。 当 stream 处理第 5 个元素时,在您的示例中再次为 2,它将在原始未修改列表中查找索引,因此numbers.indexOf( 2 )返回索引 1,这是奇数,因此i - 1将被执行。

如果您想了解更多有关如何使用带索引的流同时避免此类问题的信息,请查看本教程

在您的 stream 中,您使用的是indexOf方法

返回此列表中指定元素第一次出现的索引,如果此列表不包含该元素,则返回 -1。

由于 2 出现了两次,并且您正在处理流的元素而不是numbers列表,因此当您第二次调用该方法时,您仍在处理第一个列表的出现,它恰好是奇数(不是偶数)position。

您应该直接使用索引而不是值。 IntStream.range()正是您所需要的。

public static Double getOddNumsAverage(List<Integer> numbers) {
        return IntStream.range(0, numbers.size())
                .map(index -> index % 2 != 0 ? numbers.get(index) - 1 : numbers.get(index))
                .filter(value -> value % 2 != 0)
                .average()
                .orElseThrow(NoSuchElementException::new);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM