簡體   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