Java中HashMap数据相减异常:结果始终为0的问题排查
问题分析与修复方案
看起来你遇到的核心问题是代码逻辑存在两处关键错误,导致减法运算从未真正执行,结果始终为初始值0。咱们一步步拆解问题:
错误点1:完全无效的条件判断
你写的if (positionData.equals(dest))完全不成立:
positionData是PositionData类的实例,而dest是HashMap<String,String>对象,两者类型完全不同- 默认的
equals()方法(继承自Object)会直接返回false,所以你的减法代码块永远不会被执行,dista一直保持初始的0值
错误点2:对HashMap的错误操作
就算条件判断通过,Integer.parseInt(String.valueOf(rssi))这种写法也是完全错误的:
String.valueOf(rssi)会把整个HashMap转换成类似{XX:123, YY:456}的字符串,Integer.parseInt解析这种字符串会直接抛出NumberFormatException,根本得不到你想要的数值
修复后的代码示例
下面是修正后的逻辑,实现仅当两个HashMap存在相同键时,对对应值做减法的需求(这里默认是累加所有匹配键的差值,你可以根据业务调整为存储单个差值等):
PositionData positionData = (PositionData) intent.getSerializableExtra("PositionData"); positionsData = db.getReadings(building); // 先做空值校验,避免空指针异常 if (positionsData == null || positionsData.isEmpty() || positionData == null) { Log.v("dis:", "No valid data to process"); return; } HashMap<String, Integer> rssiActivity = positionData.getValues(); HashMap<String, Integer> rssiDb = positionsData.get(0).getValues(); int totalDista = 0; // 遍历Activity返回数据的所有键,检查数据库数据是否包含该键 for (String bssid : rssiActivity.keySet()) { if (rssiDb.containsKey(bssid)) { // 获取两个HashMap中对应键的数值,执行减法 int activityValue = rssiActivity.get(bssid); int dbValue = rssiDb.get(bssid); totalDista += (activityValue - dbValue); // 可选:打印单个键的差值,方便调试 Log.v("Single Diff", String.format("%s: %d - %d = %d", bssid, activityValue, dbValue, (activityValue - dbValue))); } } Log.v("Total dis:", String.valueOf(totalDista));
额外优化建议
- 存储单个差值:如果你不需要总和,而是想保留每个匹配键的差值,可以用新的HashMap存储:
HashMap<String, Integer> diffMap = new HashMap<>(); for (String bssid : rssiActivity.keySet()) { if (rssiDb.containsKey(bssid)) { int diff = rssiActivity.get(bssid) - rssiDb.get(bssid); diffMap.put(bssid, diff); } } - 以数据库数据为基准遍历:如果想优先匹配数据库中的所有键,只需要把循环改成
for (String bssid : rssiDb.keySet())即可 - 增强健壮性:可以给
PositionData类添加isEmpty()方法,方便判断是否有有效数据
内容的提问来源于stack exchange,提问作者Enryu
相关产品推荐
相关产品推荐

