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

已有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:01:28