如何实现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
相关产品推荐
相关产品推荐

