You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何基于HashMap实现的数组去重代码未得到预期唯一值?

HashMap实现数组去重丢失元素的原因分析

你的代码逻辑完全搞反了,这才导致有效元素被删除:

当前逻辑是:

  • 第一次遇到元素 → 存入Map
  • 第二次遇到相同元素 → 从Map中删除该元素

这就会导致:

  • 出现偶数次的元素(比如2、65,都出现2次):第一次存入,第二次删除,最终Map里完全没有这些元素
  • 出现奇数次的元素(比如5出现3次):第一次存入,第二次删除,第三次又存入,最终会被保留

而你要的去重逻辑是保留每个元素至少一次,不管出现多少次,正确的做法是:只要元素还没在Map里,就存入;已经存在的话,直接跳过即可。

修正后的代码(两种方式)

方式一:直接存入所有元素(利用HashMap键的唯一性自动去重)

package hashmaps;

import java.util.HashMap;

public class HashMap01 {
    public static void main(String[] args) {
        int[] arr = {1,2,2,4,5,5,5,7,66,65,65};
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int i=0; i<arr.length; i++){
            // 重复元素的put会覆盖旧值,但键只会保留一个
            map.put(arr[i], i);
        }
        map.forEach((k,v)-> System.out.print(k+" "));
    }
}

方式二:判断元素不存在时再存入

package hashmaps;

import java.util.HashMap;

public class HashMap01 {
    public static void main(String[] args) {
        int[] arr = {1,2,2,4,5,5,5,7,66,65,65};
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int i=0; i<arr.length; i++){
            if(!map.containsKey(arr[i])){
                map.put(arr[i], i);
            }
        }
        map.forEach((k,v)-> System.out.print(k+" "));
    }
}

补充说明

注意HashMap是无序的,所以输出顺序可能和你期望的1,2,4,5,7,66,65不完全一致,但所有去重后的元素都会被保留。如果需要保持元素在原数组中的出现顺序,可以改用LinkedHashMap。

内容的提问来源于stack exchange,提问作者workfromhome

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:55:26