如何移除Map列表中place值重复的对象
问题描述
我有一个包含name和place键的Map列表,需求为:若两个Map的place值相同,则移除后出现的那个Map。以如下示例列表为例,第二个place为Japan的Map需要被移除。
示例列表代码:
List exampleList = [ { 'name': 'Akashi', 'place': 'Japan', }, { 'name': 'Genta', 'place': 'Japan', }, { 'name': 'Hinata', 'place': 'indonesia', }, { 'name': 'Jinwoo', 'place': 'Korea', }, ];
解决方案
方案1:遍历+集合记录已出现的place
通过遍历列表,用集合记录已经处理过的place值,只保留每个place第一次出现的Map,性能更优:
void main() { List exampleList = [ {'name': 'Akashi', 'place': 'Japan'}, {'name': 'Genta', 'place': 'Japan'}, {'name': 'Hinata', 'place': 'indonesia'}, {'name': 'Jinwoo', 'place': 'Korea'}, ]; Set<String> seenPlaces = {}; List filteredList = []; for (var map in exampleList) { String place = map['place'] as String; if (!seenPlaces.contains(place)) { seenPlaces.add(place); filteredList.add(map); } } print(filteredList); // 输出结果: [{'name': 'Akashi', 'place': 'Japan'}, {'name': 'Hinata', 'place': 'indonesia'}, {'name': 'Jinwoo', 'place': 'Korea'}] }
方案2:使用fold方法简化代码
利用Dart的fold方法,在一次遍历中完成过滤,代码更简洁:
void main() { List exampleList = [ {'name': 'Akashi', 'place': 'Japan'}, {'name': 'Genta', 'place': 'Japan'}, {'name': 'Hinata', 'place': 'indonesia'}, {'name': 'Jinwoo', 'place': 'Korea'}, ]; final filteredList = exampleList.fold<List>([], (acc, map) { final place = map['place'] as String; if (!acc.any((item) => item['place'] == place)) { acc.add(map); } return acc; }); print(filteredList); }
说明
- 两种方案都会保留每个
place第一次出现的Map,自动移除后续重复条目 - 方案1的效率更高:集合判断元素存在的时间复杂度为O(1),而方案2中
any方法的时间复杂度为O(n),数据量较大时方案1更适合
内容的提问来源于stack exchange,提问作者CCP
相关产品推荐
相关产品推荐

