You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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));

额外优化建议

  1. 存储单个差值:如果你不需要总和,而是想保留每个匹配键的差值,可以用新的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);
        }
    }
    
  2. 以数据库数据为基准遍历:如果想优先匹配数据库中的所有键,只需要把循环改成for (String bssid : rssiDb.keySet())即可
  3. 增强健壮性:可以给PositionData类添加isEmpty()方法,方便判断是否有有效数据

内容的提问来源于stack exchange,提问作者Enryu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:35:59