如何检查Dictionary<String, Integer>中的值是否唯一及处理重复?
检查Map值是否唯一并返回重复统计
嘿,这个需求我之前做业务逻辑的时候正好碰到过!要检查Java里Map<String, Integer>(你说的Dictionary其实就是Java的Map啦)的所有值是否唯一,还要返回重复值的出现次数或者0,其实用Java自带的集合工具就能轻松搞定,我给你分享下我的实现思路和代码:
实现思路
- 统计值出现次数:用一个辅助的
HashMap<Integer, Integer>来记录原Map中每个Integer值的出现次数。 - 筛选重复条目:从统计结果里过滤出出现次数大于1的条目,这些就是我们要找的重复值。
- 返回对应结果:如果没有重复值,返回0;如果存在重复,返回重复值与其出现次数的映射。
完整代码示例
import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; public class MapValueUniquenessChecker { // 核心方法:检查Map值的唯一性并返回结果 public static Object checkUniqueValues(Map<String, Integer> inputMap) { // 1. 统计每个值的出现次数 Map<Integer, Integer> valueCountMap = new HashMap<>(); for (Integer value : inputMap.values()) { // 用getOrDefault简化统计逻辑,不存在则默认次数为0 valueCountMap.put(value, valueCountMap.getOrDefault(value, 0) + 1); } // 2. 过滤出出现次数>1的重复值 Map<Integer, Integer> duplicateValues = valueCountMap.entrySet() .stream() .filter(entry -> entry.getValue() > 1) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); // 3. 根据情况返回结果 if (duplicateValues.isEmpty()) { return 0; } else { return duplicateValues; } } // 测试用例 public static void main(String[] args) { // 测试存在重复值的场景 Map<String, Integer> mapWithDuplicates = new HashMap<>(); mapWithDuplicates.put("apple", 5); mapWithDuplicates.put("banana", 3); mapWithDuplicates.put("cherry", 5); mapWithDuplicates.put("date", 3); mapWithDuplicates.put("elderberry", 7); System.out.println(checkUniqueValues(mapWithDuplicates)); // 输出 {5=2, 3=2} // 测试无重复值的场景 Map<String, Integer> mapWithoutDuplicates = new HashMap<>(); mapWithoutDuplicates.put("cat", 10); mapWithoutDuplicates.put("dog", 20); mapWithoutDuplicates.put("bird", 30); System.out.println(checkUniqueValues(mapWithoutDuplicates)); // 输出 0 } }
代码细节解释
- 统计次数时用
getOrDefault方法,省去了判断key是否存在的冗余代码,直接给默认值0,每次遍历就把对应值的次数加1。 - 用Stream API来过滤和收集重复值,代码更简洁易读;如果你习惯用传统for循环,也可以手动遍历
valueCountMap的entrySet,筛选出次数大于1的条目。 - 返回值用
Object是为了兼容两种返回情况(整数0或Map),如果追求类型严谨性,你可以自定义一个返回类,或者统一返回Map(无重复时返回空Map,调用方再判断是否为空并输出0)。
额外优化建议
- 如果你的Map可能包含
null值,这段代码也能正常处理——因为HashMap允许null作为key,多个null会被统计为重复值。 - 要是需要返回更友好的字符串格式(比如“重复值5出现了2次,重复值3出现了2次”),可以修改返回逻辑:
if (duplicateValues.isEmpty()) { return 0; } else { StringBuilder resultBuilder = new StringBuilder(); for (Map.Entry<Integer, Integer> entry : duplicateValues.entrySet()) { resultBuilder.append("重复值").append(entry.getKey()) .append("出现了").append(entry.getValue()).append("次,"); } // 移除最后多余的逗号 return resultBuilder.deleteCharAt(resultBuilder.length() - 1).toString(); }
内容的提问来源于stack exchange,提问作者Rajat Pandit
相关产品推荐
相关产品推荐

