Java中如何根据重复值过滤HashMap并提取对应键值对
实现HashMap过滤重复值的键值对
这是个很实用的Map处理需求,我给你两种常用的实现方案,分别适配不同的Java版本:
方案一:Java 8+ 流式写法(简洁高效)
利用Java 8引入的Stream API,我们可以用更简洁的代码完成统计和过滤:
import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; public class DuplicateValueFilter { public static void main(String[] args) { Map<Integer, String> originalMap = new HashMap<>(); originalMap.put(1, "abc"); originalMap.put(2, "def"); originalMap.put(3, "mno"); originalMap.put(4, "abc"); originalMap.put(5, "ijk"); originalMap.put(6, "abc"); // 1. 先统计每个值在原Map中出现的次数 Map<String, Long> valueFrequency = originalMap.values().stream() .collect(Collectors.groupingBy(value -> value, Collectors.counting())); // 2. 过滤出值出现次数大于1的键值对,组装成新Map Map<Integer, String> resultMap = originalMap.entrySet().stream() .filter(entry -> valueFrequency.get(entry.getValue()) > 1) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); // 输出结果:{1=abc, 4=abc, 6=abc} System.out.println(resultMap); } }
说明:
- 第一步通过
groupingBy配合counting收集器,快速统计每个值的出现频次; - 第二步过滤原Map的Entry,只保留频次大于1的项,最后用
toMap收集成目标Map。
方案二:传统循环写法(兼容Java 7及更早版本)
如果你的项目还在使用较低版本的Java,用传统循环也能轻松实现:
import java.util.HashMap; import java.util.Map; public class DuplicateValueFilter { public static void main(String[] args) { Map<Integer, String> originalMap = new HashMap<>(); originalMap.put(1, "abc"); originalMap.put(2, "def"); originalMap.put(3, "mno"); originalMap.put(4, "abc"); originalMap.put(5, "ijk"); originalMap.put(6, "abc"); // 1. 统计每个值的出现次数 Map<String, Integer> valueCount = new HashMap<>(); for (String value : originalMap.values()) { // 用getOrDefault简化计数逻辑,Java 7及以上可用;如果是Java 6,需要手动判断null int count = valueCount.getOrDefault(value, 0); valueCount.put(value, count + 1); } // 2. 筛选符合条件的键值对 Map<Integer, String> resultMap = new HashMap<>(); for (Map.Entry<Integer, String> entry : originalMap.entrySet()) { if (valueCount.get(entry.getValue()) > 1) { resultMap.put(entry.getKey(), entry.getValue()); } } // 输出结果:{1=abc, 4=abc, 6=abc} System.out.println(resultMap); } }
说明:
- 先遍历原Map的值统计频次,再遍历Entry筛选出重复值对应的键值对;
- 如果是Java 6及更早版本,
getOrDefault方法不可用,需要替换成valueCount.get(value) == null ? 0 : valueCount.get(value)来计数。
额外提示:
如果需要处理原Map为null的边界情况,可以在开头添加非空判断,比如:
if (originalMap == null) { return new HashMap<>(); // 或者抛出异常,根据业务需求而定 }
内容的提问来源于stack exchange,提问作者M Krishna
相关产品推荐
相关产品推荐

