提问者:小点点

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


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

  • 给定一个整数列表,返回列表中所有奇数的平均值或抛出NoSuchElementException。但在此之前,从奇数位置(具有奇数索引)的每个元素中减去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);

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


共2个答案

匿名用户

在您的流中,您使用的indexOf方法

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

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

您应该直接使用索引而不是值。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);
}

匿名用户

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

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

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