Map多键合并为单键求和:车牌输出不全且重复项仅存最后一项求助
问题分析与修复方案
我帮你排查下代码里的问题,你遇到的两个bug其实都和字符串处理逻辑疏漏以及重复代码的冗余错误有关:
问题根源拆解
1. 仅输出5个车牌而非全部36个
你的代码里用了kmperlineList.get(i).replaceAll(",", ".");但没把结果赋值回去——Java里的String是不可变类型,replaceAll不会修改原字符串,只会返回一个新的字符串。这就导致后续Double.parseDouble解析带逗号的公里数时,直接抛出NumberFormatException,如果循环没有捕获异常,程序会直接中断,只处理了前几个没有逗号的有效数据,这就是为什么只输出5个车牌的核心原因。
2. 每个车牌仅保留最后一条记录(未正确累加)
在重复牌照的处理分支里,你要么是先执行了remove操作才去处理字符串替换(替换还没生效),要么完全没做替换就直接解析,导致解析失败抛出异常,后续的累加和put操作根本没执行。最终要么牌照被从map中移除,要么只有最后一次无异常的put操作生效,看起来就像是只保留了最后一条记录。
修复后的代码实现
首先我们把重复的map更新逻辑抽成一个工具方法,避免重复代码带来的疏漏,同时统一处理字符串转换和异常:
// 工具方法:统一处理车牌公里数的累加/新增逻辑 private static void updateVehicleKm(Map<String, Double> targetMap, String licensePlate, String kmString) { // 把千分位逗号替换为小数点,必须接收返回值才生效 String normalizedKm = kmString.replaceAll(",", "."); Double kmValue; // 捕获格式异常,避免单个无效数据中断整个循环 try { kmValue = Double.parseDouble(normalizedKm); } catch (NumberFormatException e) { System.err.println("跳过无效数据:车牌[" + licensePlate + "]的公里数格式错误 -> " + kmString); return; } if (targetMap.containsKey(licensePlate)) { // 累加已有车牌的公里数 Double totalKm = targetMap.get(licensePlate) + kmValue; targetMap.put(licensePlate, totalKm); } else { // 新增车牌记录 targetMap.put(licensePlate, kmValue); } }
然后把原来臃肿的if分支替换成简洁的调用:
// 替换你原来的整个if语句块 if (before) { updateVehicleKm(nachtMap, licenseplateList.get(i), kmperlineList.get(i)); } else { if (after) { updateVehicleKm(nachtMap, licenseplateList.get(i), kmperlineList.get(i)); } else { updateVehicleKm(dagMap, licenseplateList.get(i), kmperlineList.get(i)); } }
修复效果说明
- 全量车牌输出:异常捕获保证单个无效数据不会中断循环,所有36个车牌都会被处理;
- 正确累加公里数:统一的字符串替换和map更新逻辑,确保同一车牌的所有公里数都会被累加,不会丢失历史记录;
- 代码更易维护:抽离工具方法后,后续修改逻辑只需要改一处,避免重复代码的疏漏。
内容的提问来源于stack exchange,提问作者whateverrr
相关产品推荐
相关产品推荐

