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)}"); }
实现说明
- 分组存储:使用
Map<String, Map<String, dynamic>>作为临时容器,键为分类名称,值存储该分类的总额和条目数,避免了重复遍历列表查找分类的低效操作。 - 高效更新:遍历支出列表时,通过
putIfAbsent方法初始化未存在的分类,直接更新对应分类的统计数据,时间复杂度为O(n),性能更优。 - 格式转换:最后通过
map方法将分组后的Map条目转换为目标格式的列表,代码简洁易读。
运行后输出结果:
result = [{category: Breakfast, total: 390, number_of_entries: 2}, {category: Medicine, total: 400, number_of_entries: 1}]
内容的提问来源于stack exchange,提问作者Irfan Ganatra
相关产品推荐
相关产品推荐

