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

如何实现Java HashMap(注册号-车主映射)仅打印不重复Value?

解决HashMap中重复打印Value的问题

这问题我太熟了!你现在的代码直接遍历HashMap的entrySet输出value,自然会重复打印同一个车主姓名(比如示例里的Jack出现两次),而且你注释掉的data.values().remove(entry.getValue())还会触发ConcurrentModificationException——毕竟遍历集合的时候直接修改它本身是不允许的。

下面给你两种实用的解决思路:

方法一:用HashSet记录已输出的姓名

利用HashSet的去重特性,遍历的时候先判断姓名是否已经打印过,没打印过才输出并加入Set:

public static void main(String[] args) { 
    HashMap<String, String> data = new HashMap<>(); 
    Scanner reader = new Scanner(System.in); 
    data.put("AAA-111", "Jack"); 
    data.put("BBB-222", "Matt"); 
    data.put("CCC-333", "Jack"); 
    
    // 用Set存储已经输出过的车主姓名,避免重复
    Set<String> printedNames = new HashSet<>();
    for (HashMap.Entry<String, String> entry : data.entrySet()) { 
        String ownerName = entry.getValue();
        if (!printedNames.contains(ownerName)) {
            System.out.println(ownerName);
            printedNames.add(ownerName);
        }
    } 
}

这个方法的好处是兼容性好,哪怕是Java 8之前的版本也能用,而且HashSet的contains方法效率很高,不会影响性能。

方法二:用Java 8+ Stream API简化代码

如果你的项目已经用了Java 8或更高版本,直接用Stream的distinct()方法一行搞定去重:

public static void main(String[] args) { 
    HashMap<String, String> data = new HashMap<>(); 
    Scanner reader = new Scanner(System.in); 
    data.put("AAA-111", "Jack"); 
    data.put("BBB-222", "Matt"); 
    data.put("CCC-333", "Jack"); 
    
    // 直接对values去重后输出
    data.values().stream().distinct().forEach(System.out::println);
}

distinct()方法会自动根据元素的equals()和hashCode()实现去重,完全符合我们的需求,代码简洁又易读。

补充:为什么原代码的remove操作会报错?

你注释掉的data.values().remove(entry.getValue())会触发并发修改异常,因为data.values()返回的是HashMap的视图集合——它和原HashMap共享数据,在遍历entrySet的同时修改这个视图,会破坏遍历的一致性,所以Java会直接抛出异常阻止这种操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:10:56