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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:16:07