除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();
问题分析
- 嵌套循环里,你累加的是
data.get(i).getMy_amt()而不是data.get(j).getMy_amt(),相当于重复加同一个条目的值,而不是后续匹配用户的金额 - 循环条件
j<data.size()-1会漏掉列表的最后一个元素,可能导致部分金额没被计算 - 这种嵌套遍历的方式会重复计算同一用户的条目,比如当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
相关产品推荐
相关产品推荐

