如何将Java Map中重复值与唯一值的键值对拆分到不同Map?
解决方案:将Java Map按值的重复情况拆分到两个Map
要实现这个需求,核心思路是先统计每个值在原Map中的出现次数,再根据次数判断键值对该进入“重复值Map”还是“唯一值Map”。下面是具体的实现步骤和代码:
步骤分解
- 统计值的出现频率:用一个辅助Map记录每个Double值对应的出现次数。
- 遍历原Map分类存储:
- 若值的出现次数≥2,将键值对存入存放重复项的Map
- 若值的出现次数=1,将键值对存入存放唯一项的Map
完整代码示例
import java.util.HashMap; import java.util.Map; public class MapSplitByValue { public static void main(String[] args) { // 初始化原Map Map<String, Double> originalMap = new HashMap<>(); originalMap.put("First", 123.12345); originalMap.put("Second", 234.3456); originalMap.put("Third", 576.9876); originalMap.put("Fourth", 123.12345); originalMap.put("Fifth", 234.3456); originalMap.put("Sixth", 999.8888); originalMap.put("Seventh", 677.4578); // 1. 统计每个值的出现次数 Map<Double, Integer> valueCountMap = new HashMap<>(); for (Double value : originalMap.values()) { valueCountMap.put(value, valueCountMap.getOrDefault(value, 0) + 1); } // 2. 初始化两个结果Map Map<String, Double> duplicateValuesMap = new HashMap<>(); Map<String, Double> uniqueValuesMap = new HashMap<>(); // 3. 遍历原Map进行分类 for (Map.Entry<String, Double> entry : originalMap.entrySet()) { String key = entry.getKey(); Double value = entry.getValue(); int count = valueCountMap.get(value); if (count >= 2) { duplicateValuesMap.put(key, value); } else { uniqueValuesMap.put(key, value); } } // 打印结果验证 System.out.println("重复值的键值对:"); duplicateValuesMap.forEach((k, v) -> System.out.println(k + ": " + v)); System.out.println("\n唯一值的键值对:"); uniqueValuesMap.forEach((k, v) -> System.out.println(k + ": " + v)); } }
运行结果
重复值的键值对: First: 123.12345 Fourth: 123.12345 Second: 234.3456 Fifth: 234.3456 唯一值的键值对: Third: 576.9876 Sixth: 999.8888 Seventh: 677.4578
注意事项
- 浮点数精度问题:如果业务场景需要精确比较数值,建议用
BigDecimal代替Double,避免因浮点数精度误差导致的错误判断(比如0.1 + 0.2不等于0.3的情况)。 - Map顺序控制:示例用了
HashMap,如果需要保留原Map的插入顺序,可以替换为LinkedHashMap。
内容的提问来源于stack exchange,提问作者Venkata Ramana Murthy
相关产品推荐
相关产品推荐

