如何合并存在相同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
相关产品推荐
相关产品推荐

