【发布时间】:2020-02-01 04:15:22
【问题描述】:
在颤振/飞镖中,如何在确保每个新条目都是唯一的(即没有重复项)的同时将元素添加到列表中。
所以我们知道如何将元素添加到列表中:
List myList = [];
然后
myList.add(...);
但我想知道如何确保之前没有添加过任何已添加的内容。
非常感谢,
【问题讨论】:
在颤振/飞镖中,如何在确保每个新条目都是唯一的(即没有重复项)的同时将元素添加到列表中。
所以我们知道如何将元素添加到列表中:
List myList = [];
然后
myList.add(...);
但我想知道如何确保之前没有添加过任何已添加的内容。
非常感谢,
【问题讨论】:
**Vanilla Dart**
Loop through the list, adding IDs to a set as you go. Whenever you add an ID to the set that didn't already exist, add that element to a new list of distinct values.
void main() {
var list = [
Student('a'),
Student('a'),
Student('b'),
Student('c'),
];
var idSet = <String>{};
var distinct = <Student>[];
for (var d in list) {
if (idSet.add(d.id)) {
distinct.add(d);
}
}
}
class Student {
Student(this.id);
final String id;
}
【讨论】:
您可以选择使用 Dart 的扩展功能
extension ListExtension<E> on List<E> {
void addAllUnique(Iterable<E> iterable) {
for (var element in iterable) {
if (!contains(element)) {
add(element);
}
}
}
}
【讨论】:
您应该考虑使用集合。集合是唯一项的无序集合。
var mySet = <String>{};
mySet.add('something');
【讨论】:
Set 在 Dart 中的默认实现是 LinkedHashSet,它确实有一个顺序 - 插入顺序。
使用地图进行初始添加,地图不会让重复然后从地图转换为列表。 地图是名称值对,因此如果这些是字符串,只需将名称和值设置为相同,如果它是一个对象,则将“uniqueID”设置为名称,将对象设置为值...... 然后,您可以获取 Name 集或通常的 Value 集,并将其转换为列表以进行迭代和循环。
https://www.tutorialspoint.com/dart_programming/dart_programming_map.htm
【讨论】:
Set,特别是 LinkedHashSet,它可以 O(1) 检测重复项并按插入顺序进行迭代。