Dart - 在列表中查找重复值

Posted

技术标签:

【中文标题】Dart - 在列表中查找重复值【英文标题】:Dart - find duplicate values on a List 【发布时间】:2020-09-10 09:34:16 【问题描述】:

如何在列表中找到重复值, 假设我有一个这样的列表:

List<Map<String, dynamic>> users = [
     "name": 'John', 'age': 18 ,
     "name": 'Jane', 'age': 21 ,
     "name": 'Mary', 'age': 23 ,
     "name": 'Mary', 'age': 27 ,
  ];

如何迭代列表以了解是否有同名用户?

【问题讨论】:

您可以从这个问题中得到答案(它展示了如何从列表中删除重复元素)-***.com/questions/12030613/… 这能回答你的问题吗? How to delete duplicates in a dart List? list.distinct()? 【参考方案1】:

一个简单的方法是这样的:

void main() 
  List<Map<String, dynamic>> users = [
     "name": 'John', 'age': 18 ,
     "name": 'Jane', 'age': 21 ,
     "name": 'Mary', 'age': 23 ,
     "name": 'Mary', 'age': 27 ,
  ];
  List names = List();
  users.forEach((u)
    if (names.contains(u["name"])) print("duplicate $u["name"]");
    else names.add(u["name"]);
  );

结果:

duplicate Mary

【讨论】:

【参考方案2】:

可能是带有扩展的更清洁的解决方案。

通过声明:

extension ListExtensions<E> on List<E> 
  List<E> removeAll(Iterable<E> allToRemove) 
    if (allToRemove == null) 
      return this;
     else 
      allToRemove.forEach((element) 
        this.remove(element);
      );
      return this;
    
  

  List<E> getDupes() 
    List<E> dupes = List.from(this);
    dupes.removeAll(this.toSet().toList());
    return dupes;
  

然后你可以通过调用List.getDupes()找到你的重复项

请注意,我当前的 Dart 库中不存在函数 removeAll,以防他们以某种方式实现它时您正在阅读此内容。

还要记住equals() 函数。在List&lt;String&gt; 中,["Rafa", "rafa"] 不包含重复项。

如果您确实想达到这种细化水平,则必须应用 distinctBy 函数:

extension ListExtensions<E> on List<E> 
  List<E> removeAll(Iterable<E> allToRemove) 
    if (allToRemove == null) 
      return this;
     else 
      allToRemove.forEach((element) 
        this.remove(element);
      );
      return this;
    
  

  List<E> distinctBy(predicate(E selector)) 
    HashSet set = HashSet();
    List<E> list = [];
    toList().forEach((e) 
      dynamic key = predicate(e);
      if (set.add(key)) 
        list.add(e);
      
    );

    return list;
  

  List<E> getDupes(E Function(E) distinctBy) 
    List<E> dupes = List.from(this);
    if (distinctBy == null) 
      dupes.removeAll(this.toSet().toList());
     else 
      dupes.removeAll(this.distinctBy(distinctBy).toSet().toList());
    

    return dupes;
  

【讨论】:

【参考方案3】:

我感觉 Rafael 的答案有类似于 Kotlin 的代码,所以我四处挖掘,发现这些函数是 kt_dart 库的一部分,它基本上获取了 Kotlin 标准库并将其移植到 Dart。

我来自 Kotlin 背景,所以我经常使用这个包。如果你使用它,你可以简单地使扩展变得更短:

extension KtListExtensions<T> on KtList<T> 
  KtList<T> get duplicates => toMutableList()..removeAll(toSet().toList());

只需确保在您的 pubspec 中添加 kt_dartkt_dart: ^0.8.0

示例

final list = ['apples', 'oranges', 'bananas', 'apples'].toImmutableList();
final duplicates = list.duplicates; // should be ['apples'] in the form of an ImmutableList<String>

【讨论】:

以上是关于Dart - 在列表中查找重复值的主要内容,如果未能解决你的问题,请参考以下文章

在列表列表中查找最小值[重复]

在递减然后递增并且可能包含重复项的列表中查找最小值

如何从列表 Dart 中删除重复项 |扑

如何使用 Dart / Flutter 中的列表从列表中删除重复元素?

在字典中查找重复列表并打印重复列表的键

在 Dart 中合并两个对象列表