基于键值对对比两个TreeMap的代码逻辑错误排查求助
问题分析与解决方案
问题根源
你当前的代码核心问题在于同步遍历两个Map的迭代器——这会把travelCosts里的第i个条目和travellerBalances里的第i个条目强行配对,完全没有按照travellerId(也就是Map的key)去匹配对应的数据。比如你提到的场景:travelCosts里的travellerId 2001会被和travellerBalances里的第一个条目(比如2002)的余额对比,而不是去检查travellerBalances中是否存在2001这个key,这就完全偏离了你的需求。
修正后的代码
我们只需要遍历travelCosts的所有条目,对每个travellerId直接从travellerBalances中查找对应的余额即可,同时利用泛型优化代码,避免不必要的强制类型转换:
public static void compareTravelBalance(Map<String, Integer> travelCosts, Map<String, Integer> travellerBalances) { // 只遍历旅行费用Map的所有条目 for (Map.Entry<String, Integer> costEntry : travelCosts.entrySet()) { String travellerId = costEntry.getKey(); int travelCost = costEntry.getValue(); // 根据travellerId检查余额Map中是否存在该用户 if (travellerBalances.containsKey(travellerId)) { int balance = travellerBalances.get(travellerId); if (travelCost > balance) { System.out.printf("Insufficient funds for %s: Cost: %d Balance: %d%n", travellerId, travelCost, balance); } else { System.out.printf("Approved! for: %s: Cost: %d Balance: %d%n", travellerId, travelCost, balance); } } else { System.out.printf("Traveller ID %s does not exist%n", travellerId); } } }
额外优化说明
- 用增强for循环(foreach)替代迭代器,让代码更简洁易读;
- 使用
printf格式化输出,比字符串拼接更清晰、易维护; - 保留泛型定义,避免了原代码中的强制类型转换,减少了运行时出错的风险。
修改后,代码会严格按照travellerId匹配对应余额,比如当travelCosts中存在2001,但travellerBalances中没有该ID时,会正确输出“Traveller ID 2001 does not exist”,完全符合你的需求。
内容的提问来源于stack exchange,提问作者JJK
相关产品推荐
相关产品推荐

