Java如何获取HashMap中关联最小值的所有Key并存入List
获取HashMap中映射到最低Value的所有Key实现方案
原方案问题
最初实现的排序后取首个元素的逻辑,默认最低值只对应一个Key,通过limit(1)直接截断流,所有和首个元素Value相等的后续条目都会被丢弃,无法覆盖多Key并列最低值的场景。而且全量排序的时间复杂度为O(nlogn),处理大Map时存在不必要的性能开销。
最优实现思路
不需要对全量条目排序,分两步处理即可,整体时间复杂度O(n):
- 第一步:遍历Map的所有Value,找到全局最小值
- 第二步:再次遍历所有条目,过滤出Value等于全局最小值的条目,收集对应的Key到List
Stream写法(Java 8+ 支持)
private static List<String> getMinValueKeys(HashMap<String, Integer> map) { // 查找全局最小值,空Map直接抛出参数异常,可根据业务需求调整空处理逻辑 Integer minValue = map.values().stream() .min(Integer::compareTo) .orElseThrow(() -> new IllegalArgumentException("传入的Map不能为空")); // 过滤所有值等于最小值的Key return map.entrySet().stream() .filter(entry -> entry.getValue().equals(minValue)) .map(Map.Entry::getKey) .collect(Collectors.toList()); }
测试效果:
- 针对单最小值的测试用例,返回结果为
[John],符合预期 - 针对多Key并列最低值的测试用例,返回结果为
[John, Keith],符合预期
普通循环写法(兼容所有Java版本)
如果项目不支持Stream写法,可以用基础循环实现,逻辑完全一致:
private static List<String> getMinValueKeys(HashMap<String, Integer> map) { List<String> res = new ArrayList<>(); if (map.isEmpty()) { return res; } // 第一遍遍历找最小值 int minVal = Integer.MAX_VALUE; for (int val : map.values()) { if (val < minVal) { minVal = val; } } // 第二遍遍历收集符合条件的Key for (Map.Entry<String, Integer> entry : map.entrySet()) { if (entry.getValue() == minVal) { res.add(entry.getKey()); } } return res; }
注意点
- 不要为了图省事在排序后通过循环判断相邻元素值是否相等来收集结果,排序带来的性能损耗完全可以避免
- 如果Value是自定义对象,只需要替换比较逻辑即可,整体实现思路不变
内容的提问来源于stack exchange,提问作者merry
相关产品推荐
相关产品推荐

