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

Android饼图问题:合并同名项并展示其数值总和

解决饼图同名项重复问题:合并切片并求和

我来帮你搞定这个饼图重复项的问题~你现在的代码是把每条支出数据直接塞进列表,完全没做合并求和,所以同名的"food"会重复出现。咱们用HashMap来统计每个分类的总支出,就能轻松实现合并展示了。

核心思路

  1. 用HashMap<String, Integer>替代原来的两个ArrayList,key存分类名称,value存该分类的累计支出金额
  2. 遍历Realm查询结果时,对每个分类做累加:已经存在的就加钱,不存在的就新增条目
  3. 最后从HashMap里提取数据生成饼图条目,这样每个分类只会出现一次,金额是总和
  4. 修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:31:33