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

如何合并存在相同key的Map并保留重复key的条目?

如何合并包含相同key的Map并保留重复条目?

Dart的标准Map(如默认的HashMap)遵循键唯一性规则,添加重复键时会直接覆盖旧值,因此无法直接用普通Map实现“保留重复key条目”的需求。但可以通过以下两种方式实现类似效果:

方案1:用List<MapEntry<K,V>>存储所有键值对

这种方式直接保留所有原始键值对,允许重复key,适合需要完整保留所有条目顺序的场景:

void main() {
  final test4 = {'rifa':'aaa'};
  final test5 = {'rifa':'bbb'};
  
  // 合并两个Map的所有键值对到列表中
  final allEntries = [...test4.entries, ...test5.entries];
  
  // 遍历输出所有条目
  allEntries.forEach((entry) => print('${entry.key}: ${entry.value}'));
  print('总条目数: ${allEntries.length}'); // 输出: 2
}

运行结果:

rifa: aaa
rifa: bbb
总条目数: 2

方案2:用Map<K, List<V>>收集相同key的所有值

如果需要保留Map的结构,同时把相同key的多个值存到列表中,适合需要通过key快速查询所有对应值的场景:

void main() {
  final test4 = {'rifa':'aaa'};
  final test5 = {'rifa':'bbb'};
  
  final mergedMap = <String, List<String>>{};
  
  // 封装工具函数简化添加逻辑
  void addEntry(MapEntry<String, String> entry) {
    mergedMap.putIfAbsent(entry.key, () => []).add(entry.value);
  }
  
  // 批量添加两个Map的条目
  test4.entries.forEach(addEntry);
  test5.entries.forEach(addEntry);
  
  print(mergedMap); // 输出: {rifa: [aaa, bbb]}
}

补充说明

你代码中test6仅保留1条数据的原因是:Map.addAll()方法遍历传入的Map条目时,若目标Map已存在对应key,会用新值覆盖旧值,最终每个key只会保留最后一次添加的值。而List允许重复元素,所以test3能得到长度为2的结果——这是List和Map的核心特性差异。

内容的提问来源于stack exchange,提问作者R Rifa Fauzi Komara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:30:49