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

除HashMap外如何存储字符串-整数对?RecyclerView用户金额求和异常排查

如何计算RecyclerView中重复用户的付款金额总和

这是我用于存储支出相关信息的RecyclerView。我需要对每位对应用户的付款金额进行求和,例如:sadaf:卢比(50+10+5)=65,Gulatiji:卢比50=50,Amen:卢比(50+5)=55。

我原本考虑使用HashMap,但问题在于RecyclerView中的用户名并非唯一。那么我该如何存储每位对应用户的求和结果?我尝试了以下代码,但得到了错误结果:我能成功对总金额列求和,但付款金额的计算结果有误。目前我仅尝试用整数变量my_total计算单个用户的总金额,得到sadaf的结果为110,但正确结果应为65。

你之前写的代码存在几个逻辑问题,先看看你的原始代码:

calcuationAdap = new CalcuationAdap(Calculation.this,data); 
for (int i = 0 ;i<data.size();i++) { 
    System.out.println(data.get(i).getItem()); 
    main_total = main_total + Integer.parseInt(data.get(i).getTot_amt()); 
} 
for(int i=0;i<data.size();i++) { 
    for( int j=i+1;j<data.size()-1;j++) { 
        if(data.get(i).getUser_name().equals(data.get(j).getUser_name())) { 
            System.out.println(data.get(i).getUser_name()); 
            my_total = my_total+Integer.parseInt(data.get(i).getMy_amt()); 
        } 
    } 
} 
Toast.makeText(getApplicationContext(), String.valueOf(main_total ), Toast.LENGTH_SHORT).show(); 
Toast.makeText(getApplicationContext(), String.valueOf(my_total), Toast.LENGTH_SHORT).show(); 

问题分析

  1. 嵌套循环里,你累加的是data.get(i).getMy_amt()而不是data.get(j).getMy_amt(),相当于重复加同一个条目的值,而不是后续匹配用户的金额
  2. 循环条件j<data.size()-1会漏掉列表的最后一个元素,可能导致部分金额没被计算
  3. 这种嵌套遍历的方式会重复计算同一用户的条目,比如当i指向sadaf的第一个条目时,j遍历后面的sadaf条目;当i指向sadaf的第二个条目时,又会再次累加,最终结果翻倍

正确解决方案:用HashMap分组求和

其实HashMap正是解决这种「按key分组统计」问题的最佳工具,不管用户名重复多少次,我们只需要以用户名为key,累计付款金额为value,一次遍历就能完成所有计算:

// 初始化HashMap,存储每个用户的付款总金额
HashMap<String, Integer> userPaymentSum = new HashMap<>();
int main_total = 0;

calcuationAdap = new CalcuationAdap(Calculation.this, data);

// 一次遍历,同时计算总金额和每个用户的付款总和
for (int i = 0; i < data.size(); i++) {
    System.out.println(data.get(i).getItem());
    // 累加总金额
    main_total += Integer.parseInt(data.get(i).getTot_amt());
    
    // 处理当前用户的付款金额
    String userName = data.get(i).getUser_name();
    int currentMyAmt = Integer.parseInt(data.get(i).getMy_amt());
    
    if (userPaymentSum.containsKey(userName)) {
        // 用户已存在,累加现有金额
        userPaymentSum.put(userName, userPaymentSum.get(userName) + currentMyAmt);
    } else {
        // 用户不存在,初始化金额
        userPaymentSum.put(userName, currentMyAmt);
    }
}

// 显示总金额
Toast.makeText(getApplicationContext(), String.valueOf(main_total), Toast.LENGTH_SHORT).show();

// 遍历HashMap,显示每个用户的付款总和
for (Map.Entry<String, Integer> entry : userPaymentSum.entrySet()) {
    String userSumMsg = entry.getKey() + ":卢比" + entry.getValue();
    Toast.makeText(getApplicationContext(), userSumMsg, Toast.LENGTH_SHORT).show();
    System.out.println(userSumMsg); // 也可以打印日志查看
}

代码逻辑说明

  • 遍历数据列表时,每处理一个条目,先把总金额加上当前条目的tot_amt
  • 取出当前用户名和对应的my_amt,检查HashMap中是否已有该用户:
    • 如果有,就把现有金额加上当前金额,更新HashMap
    • 如果没有,就把当前用户和金额存入HashMap
  • 遍历完成后,HashMap里就保存了每个用户的付款总金额,你可以随时遍历它获取结果

这样处理后,sadaf的50+10+5就会正确计算为65,不会出现重复累加的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:44:44