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

Flutter中基于Map支出列表生成分类统计的优化实现

优雅实现按分类统计支出的方案

给定一个存储支出信息的Map列表,我们需要按分类汇总每个类别的支出总额及对应条目数,生成结构化的统计列表。以下是更简洁高效的实现方案:

完整优化代码

List<Map<String, dynamic>> expenses = [
  {'category': 'Breakfast', 'amount': 200},
  {'category': 'Breakfast', 'amount': 190},
  {'category': 'Medicine', 'amount': 400},
];

List<Map<String, dynamic>> generate_category_statistics(List<Map<String, dynamic>> list_expense) {
  // 用Map分组存储每个分类的临时统计数据
  final categoryStats = <String, Map<String, dynamic>>{};

  for (final expense in list_expense) {
    final category = expense['category'] as String;
    final amount = expense['amount'] as num;

    // 若分类未初始化,创建初始统计项
    categoryStats.putIfAbsent(category, () => {'total': 0, 'count': 0});
    // 更新当前分类的总额和条目数
    categoryStats[category]!['total'] = (categoryStats[category]!['total'] as num) + amount;
    categoryStats[category]!['count'] = (categoryStats[category]!['count'] as int) + 1;
  }

  // 将分组数据转换为目标格式的列表
  return categoryStats.entries.map((entry) => {
    'category': entry.key,
    'total': entry.value['total'],
    'number_of_entries': entry.value['count'],
  }).toList();
}

void main() {
  print("result = ${generate_category_statistics(expenses)}");
}

实现说明

  1. 分组存储:使用Map<String, Map<String, dynamic>>作为临时容器,键为分类名称,值存储该分类的总额和条目数,避免了重复遍历列表查找分类的低效操作。
  2. 高效更新:遍历支出列表时,通过putIfAbsent方法初始化未存在的分类,直接更新对应分类的统计数据,时间复杂度为O(n),性能更优。
  3. 格式转换:最后通过map方法将分组后的Map条目转换为目标格式的列表,代码简洁易读。

运行后输出结果:

result = [{category: Breakfast, total: 390, number_of_entries: 2}, {category: Medicine, total: 400, number_of_entries: 1}]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:10:46