【问题标题】:Dart - find duplicate values on a ListDart - 在列表中查找重复值
【发布时间】: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 },
  ];

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

【问题讨论】:

标签: list flutter dart


【解决方案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>
      

      【讨论】:

        猜你喜欢
        • 2019-11-10
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 2021-10-19
        • 2013-02-21
        • 2019-03-21
        • 2013-11-17
        相关资源
        最近更新 更多