flutter Dart -查找列表中的重复值

ctzwtxfj  于 2022-12-14  发布在  Flutter
关注(0)|答案(4)|浏览(603)

如何在列表中查找重复值,假设我有一个如下的列表:

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

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

8aqjt8rx

8aqjt8rx1#

一个简单的方法是:

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
am46iovg

am46iovg2#

可能是一个更干净的解决方案与扩展。
通过声明:

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()来查找重复项
请注意,函数removeAll不存在于我当前的Dart库中,以防您在他们以某种方式实现该函数时阅读该函数。
还要记住equals()函数,在List<String>中,["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;
  }
}
bvjxkvbb

bvjxkvbb3#

我有一种感觉,拉斐尔的答案有类似于Kotlin的代码,所以我四处挖掘,看到这些函数是kt_dart库的一部分,它基本上得到Kotlin标准库并将其移植到Dart。
我来自一个Kotlin背景,所以我经常使用这个包。如果你使用它,你可以简单地让扩展短这么多:

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

只需确保在pubspec中添加kt_dart即可:kt_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>
jqjz2hbq

jqjz2hbq4#

void main() {

  List<String> country = [
    "Nepal", 
    "Nepal", 
    "USA",
    "Canada",
    "Canada",
    "China",
    "Russia",
];
List DupCountry = [];
country.forEach((dup){
if(DupCountry.contains(dup)){
print("Duplicate in List= ${dup}");
}
else{
  DupCountry.add(dup);
}
});

}

相关问题