Android饼图问题:合并同名项并展示其数值总和
解决饼图同名项重复问题:合并切片并求和
我来帮你搞定这个饼图重复项的问题~你现在的代码是把每条支出数据直接塞进列表,完全没做合并求和,所以同名的"food"会重复出现。咱们用HashMap来统计每个分类的总支出,就能轻松实现合并展示了。
核心思路
- 用
HashMap<String, Integer>替代原来的两个ArrayList,key存分类名称,value存该分类的累计支出金额 - 遍历Realm查询结果时,对每个分类做累加:已经存在的就加钱,不存在的就新增条目
- 最后从HashMap里提取数据生成饼图条目,这样每个分类只会出现一次,金额是总和
- 修复
setPieChart里的低级错误:别在循环里反复创建DataSet、查找控件,这些只需要执行一次
修改后的完整代码
Realm realm; // 用HashMap统计每个分类的总支出,替代原来的两个ArrayList HashMap<String, Integer> expenseMap = new HashMap<>(); RealmResults<Credit> result = realm.where(Credit.class).equalTo("regId", userId).findAll(); result.load(); for (Credit p : result) { String itemName = p.getItem(); int currentExpense = p.getExpense(); // 累加金额:存在就加,不存在就新增 if(expenseMap.containsKey(itemName)){ expenseMap.put(itemName, expenseMap.get(itemName) + currentExpense); } else { expenseMap.put(itemName, currentExpense); } } setPieChart(expenseMap); } private void setPieChart(HashMap<String, Integer> expenseMap) { List<PieEntry> pieEntries = new ArrayList<>(); // 从HashMap生成合并后的饼图条目 for(Map.Entry<String, Integer> entry : expenseMap.entrySet()){ pieEntries.add(new PieEntry(entry.getValue(), entry.getKey())); } // 只初始化一次饼图配置 PieDataSet dataSet = new PieDataSet(pieEntries,"Spending of User"); PieData data = new PieData(dataSet); dataSet.setColors(ColorTemplate.COLORFUL_COLORS); data.setValueTextSize(20f); // 只查找一次图表控件 chart = (PieChart) findViewById(R.id.pieChart); chart.animateY(1500); chart.setData(data); chart.invalidate(); }
关键改进点
- 用HashMap做统计比嵌套循环对比高效多了,代码也更简洁
- 饼图的初始化逻辑只跑一次,避免了重复设置的性能浪费
- 自动合并同名分类,直接展示累计金额,完美匹配你的需求
内容的提问来源于stack exchange,提问作者Sudeep
相关产品推荐
相关产品推荐

