如何找出ArrayList<HashMap<String, String>>中的重复DATA_ID并提取计算?
解决ArrayList<HashMap<String, String>>中重复DATA_ID的提取与VALUE计算问题
步骤1:统计DATA_ID的出现频率
先遍历列表,统计每个DATA_ID的出现次数,快速定位重复ID:
ArrayList<HashMap<String, String>> listMap = // 你的数据源 HashMap<String, Integer> countMap = new HashMap<>(); for (HashMap<String, String> map : listMap) { String dataId = map.get("DATA_ID"); countMap.put(dataId, countMap.getOrDefault(dataId, 0) + 1); }
步骤2:筛选重复的DATA_ID
从统计结果中提取出现次数>1的DATA_ID:
Set<String> duplicateIds = new HashSet<>(); for (Map.Entry<String, Integer> entry : countMap.entrySet()) { if (entry.getValue() > 1) { duplicateIds.add(entry.getKey()); } }
步骤3:提取重复ID对应的元素
遍历原列表,将重复DATA_ID的元素按ID分组,方便后续计算:
Map<String, List<HashMap<String, String>>> groupedDuplicates = new HashMap<>(); for (HashMap<String, String> map : listMap) { String dataId = map.get("DATA_ID"); if (duplicateIds.contains(dataId)) { groupedDuplicates.computeIfAbsent(dataId, k -> new ArrayList<>()).add(map); } }
步骤4:对VALUE进行计算
以求和为例,将每个元素的VALUE转为数值后计算(可根据需求替换为平均、最大/最小值等):
Map<String, Double> valueSumMap = new HashMap<>(); for (Map.Entry<String, List<HashMap<String, String>>> entry : groupedDuplicates.entrySet()) { String dataId = entry.getKey(); List<HashMap<String, String>> duplicates = entry.getValue(); double sum = 0.0; for (HashMap<String, String> map : duplicates) { // 处理可能的格式异常 try { double value = Double.parseDouble(map.get("VALUE")); sum += value; } catch (NumberFormatException e) { System.err.println("DATA_ID " + dataId + " 存在无效VALUE格式"); } } valueSumMap.put(dataId, sum); } // 示例输出:DATA_ID=01的VALUE总和 System.out.println("DATA_ID=01的VALUE总和:" + valueSumMap.get("01"));
Java 8+ Stream简化写法
用Stream API可以大幅简化代码,同时实现相同逻辑:
// 分组并过滤出重复ID的元素集合 Map<String, List<HashMap<String, String>>> groupedDuplicates = listMap.stream() .collect(Collectors.groupingBy(map -> map.get("DATA_ID"))) .entrySet().stream() .filter(entry -> entry.getValue().size() > 1) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); // 计算每个重复ID的VALUE总和 Map<String, Double> valueSumMap = groupedDuplicates.entrySet().stream() .collect(Collectors.toMap( Map.Entry::getKey, entry -> entry.getValue().stream() .map(map -> Double.parseDouble(map.get("VALUE"))) .reduce(0.0, Double::sum) ));
内容的提问来源于stack exchange,提问作者mingming
相关产品推荐
相关产品推荐

