为什么我要从偶数位置的元素中减去 1?我只需要奇数位置(奇数索引)Java
Why do I subtract 1 from the element on an even position? I need only odd positions (odd indexes) Java
我需要你的帮助。我有任务:
- 给定一个整数列表,return 列表中所有奇数的平均值或抛出 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?我只需要奇数位置(奇数索引)。
This is the picture
您的问题出在 List#indexOf(Object)
上,它总是 returns 遇到的第一个相等值的索引 。
现在您正在流中处理您的值,因此减去的值将返回到流中,但不会修改原始 numbers
列表。当流处理第 5 个元素时,在您的示例中再次为 2,它将在 原始未修改列表 中查找索引,因此 numbers.indexOf( 2 )
returns 索引1 是奇数,因此 i - 1
将被执行。
如果您想详细了解如何使用带索引的流,同时避免此类问题,请查看 this tutorial
在您的信息流中,您正在使用 indexOf
方法
Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element.
因为 2 出现了两次并且您正在处理 流的元素 而不是 numbers
列表,当您第二次调用该方法时您仍然处理第一个列表的出现,它恰好处于奇数(非偶数)位置。
您应该直接使用索引而不是值。 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);
}
我需要你的帮助。我有任务:
- 给定一个整数列表,return 列表中所有奇数的平均值或抛出 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?我只需要奇数位置(奇数索引)。 This is the picture
您的问题出在 List#indexOf(Object)
上,它总是 returns 遇到的第一个相等值的索引 。
现在您正在流中处理您的值,因此减去的值将返回到流中,但不会修改原始 numbers
列表。当流处理第 5 个元素时,在您的示例中再次为 2,它将在 原始未修改列表 中查找索引,因此 numbers.indexOf( 2 )
returns 索引1 是奇数,因此 i - 1
将被执行。
如果您想详细了解如何使用带索引的流,同时避免此类问题,请查看 this tutorial
在您的信息流中,您正在使用 indexOf
方法
Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element.
因为 2 出现了两次并且您正在处理 流的元素 而不是 numbers
列表,当您第二次调用该方法时您仍然处理第一个列表的出现,它恰好处于奇数(非偶数)位置。
您应该直接使用索引而不是值。 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);
}