已有for循环解法,求Map列表按title分组的其他实现方式
问题描述
现有如下Map列表:
List values = [ {'title': 'a', 'count': 1}, {'title': 'b', 'count': 2}, {'title': 'b', 'count': 8}, {'title': 'c', 'count': 1}, {'title': 'a', 'count': 4}, {'title': 'a', 'count': 9}, ];
想要生成如下结构的新Map列表:
List myList = [ { "title": "a", "values": [ {'title': 'a', 'count': 1}, {'title': 'a', 'count': 4}, {'title': 'a', 'count': 9}, ] }, { "title": "b", "values": [ {'title': 'b', 'count': 2}, {'title': 'b', 'count': 8} ] }, { "title": "c", "values": [ {'title': 'c', 'count': 1}, ] } ];
已通过for循环实现该功能,代码如下:
createList(List values) { List list = []; for (int i = 0; i < values.length; i++) { if (list.any((element) => element['title'] == values[i]['title'])) { list .firstWhere((e) => e['title'] == values[i]['title'])['values'] .add(values[i]); } else { list.add({ 'title': values[i]['title'], 'values': [values[i]] }); } } return list; }
请问是否存在其他实现方式来生成上述myList?
替代实现方式
1. 使用Map作为中间容器(高效O(n)实现)
原方法时间复杂度为O(n²),每次any和firstWhere都需要遍历已有列表。用Map作为分组容器可将时间复杂度降至O(n),数据量大时效率提升明显:
List createList(List values) { final groupedMap = <String, List<Map>>{}; for (final item in values) { final title = item['title'] as String; groupedMap.putIfAbsent(title, () => []).add(item); } return groupedMap.entries.map((entry) => { 'title': entry.key, 'values': entry.value }).toList(); }
2. 使用collection包的groupBy(简洁可读性高)
若允许引入第三方包,collection中的groupBy能大幅简化代码。先在pubspec.yaml添加依赖:
dependencies: collection: ^1.18.0
再实现代码:
import 'package:collection/collection.dart'; List createList(List values) { final grouped = groupBy(values, (item) => item['title']); return grouped.entries.map((entry) => { 'title': entry.key, 'values': entry.value.toList() }).toList(); }
3. 使用forEach遍历(写法简洁)
逻辑和第一种方法一致,改用forEach遍历实现:
List createList(List values) { final map = <String, List<Map>>{}; values.forEach((item) { final title = item['title']; if (!map.containsKey(title)) { map[title] = []; } map[title]!.add(item); }); return map.entries.map((e) => {'title': e.key, 'values': e.value}).toList(); }
内容的提问来源于stack exchange,提问作者Hamou Ouyaba
相关产品推荐
相关产品推荐

