如何使用hashmap计算数组中奇数频率元素的总和

How to calculate the sum of odd frequency elements in array using hashmap

Gievn 在数组 arr[] = {5,3,3,3,3,5,5,2} 之后,我必须生成仅具有奇数频率的元素的总和。我的输出应该是 7,即 5 + 2 的总和。

出于某种原因,我得到了 10,但我不明白为什么。

public class OddnumberOfElements {
    public static void main(String[] args) {
        int arr[] = {5, 3, 3, 3, 3, 5, 5, 2};
        LinkedHashMap<Integer, Integer> map = new LinkedHashMap<Integer, Integer>();
        for (int i = 0; i < arr.length; i++) {
            if (map.containsKey(arr[i])) {
                map.put(arr[i], map.get(arr[i]) + 1);
            }
            map.put(arr[i], 1);
        }
        int sum = 0;
        for (Map.Entry<Integer, Integer> e : map.entrySet()) {
            if (e.getValue() % 2 != 0) {
                sum = sum + e.getKey();
            }
        }
        System.out.println(sum);
    }
}

缺少其他内容

if(map.containsKey(arr[i])){
            map.put(arr[i],map.get(arr[i])+1);
        }
else
        map.put(arr[i], 1);

这就是为什么您的元素每次都以频率 1 而不是递增的方式进行初始化。所以输出是 5+3+2=10

您正在覆盖增量而不是:

 if(map.containsKey(arr[i])){
            map.put(arr[i],map.get(arr[i])+1);
        }
        map.put(arr[i], 1);

 if(map.containsKey(arr[i])){
                map.put(arr[i],map.get(arr[i])+1);
            }
            else map.put(arr[i], 1);

您的第一个 for 循环检查是否已将 int 值作为键包含在您的 map 中以增加其频率。如果 int 已经存在,则其相应的频率会增加,但相反的条件是 未放置在 else 分支中,将 int 频率重置为 1。

循环应该这样写:

for (int i = 0; i < arr.length; i++) {
    if (map.containsKey(arr[i])) {
        map.put(arr[i], map.get(arr[i]) + 1);
    } else {
        map.put(arr[i], 1);
    }
}

此外,如果允许你使用流(我不知道这是否是学校作业),你可以在更紧凑的写作中实现你正在做的事情。

int arr[] = {5, 3, 3, 3, 3, 5, 5, 2};
Integer sum = Arrays.stream(arr)
        .boxed()
        .collect(Collectors.groupingBy(Integer::intValue, Collectors.counting())) //Creating a hashmap where to each int (boxed to Integer) corresponds its frequency
        .entrySet().stream() //Streaming the map's entries
        .filter(e -> e.getValue() % 2 == 1) //for each entry we keep only the ones with an odd frequency
        .collect(Collectors.summingInt(e -> e.getKey())); //Summing the values of Integers with an odd frequency