如何在Java中合并HashMap中重复值对应的键
实现HashMap相同值对应的键合并需求
针对你提出的需求——将原HashMap中值相同的键合并为新键,最终生成键为合并后字符串、值为原重复值的新HashMap,这里提供两种实用的Java实现方式:
方法一:传统循环遍历(兼容所有Java版本)
核心思路是先用临时容器按值分组,把对应原键拼接起来,最后转成目标Map:
HashMap<String, String> map = new HashMap<>(); HashMap<String, String> newMap = new HashMap<>(); map.put("A","1"); map.put("B","2"); map.put("C","2"); map.put("D","1"); // 临时容器:key为原map的值,value为拼接后的原键字符串 Map<String, StringBuilder> tempMap = new HashMap<>(); // 遍历原map,拼接同值对应的键 for (Map.Entry<String, String> entry : map.entrySet()) { String originalKey = entry.getKey(); String originalValue = entry.getValue(); // 若tempMap中无该值的条目,新建StringBuilder;有则直接追加原键 tempMap.computeIfAbsent(originalValue, k -> new StringBuilder()).append(originalKey); } // 将临时容器的内容转成目标newMap for (Map.Entry<String, StringBuilder> entry : tempMap.entrySet()) { newMap.put(entry.getValue().toString(), entry.getKey()); } // 验证输出 System.out.println(newMap); // 输出 {AD=1, BC=2}
方法二:Java 8+ Stream API(简洁写法)
利用Stream的分组和收集器特性,一行链式调用完成转换:
HashMap<String, String> map = new HashMap<>(); map.put("A","1"); map.put("B","2"); map.put("C","2"); map.put("D","1"); HashMap<String, String> newMap = map.entrySet().stream() // 第一步:按原map的值分组,把同值的键拼接成字符串 .collect(Collectors.groupingBy( Map.Entry::getValue, Collectors.mapping(Map.Entry::getKey, Collectors.joining()) )) // 第二步:反转分组后的键值对,存入目标HashMap .entrySet().stream() .collect(Collectors.toMap( Map.Entry::getValue, Map.Entry::getKey, (oldVal, newVal) -> oldVal, // 键冲突处理(此处理论不会触发) HashMap::new )); System.out.println(newMap); // 输出 {AD=1, BC=2}
内容的提问来源于stack exchange,提问作者Karthik kashyap
相关产品推荐
相关产品推荐

