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<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;
【讨论】:
【参考方案3】:我感觉 Rafael 的答案有类似于 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>
【讨论】:
以上是关于Dart - 在列表中查找重复值的主要内容,如果未能解决你的问题,请参考以下文章