Как удалить дубликаты в списке дротиков? list.distinct()?
Как удалить дубликаты из списка, не обманывая себя набором? Есть что-то вроде list.distinct()? или list.unique()?
void main() {
print("Hello, World!");
List<String> list = ['abc',"abc",'def'];
list.forEach((f)=>print("this is list $f"));
Set<String> set = new Set<String>.from(list);
print("this is #0 ${list[0]}");
set.forEach((f)=>print("set: $f"));
List<String> l2= new List<String>.from(set);
l2.forEach((f)=>print("This is new $f"));
}
Hello, World!
this is list abc
this is list abc
this is list def
this is #0 abc
set: abc
set: def
This is new abc
This is new def
Изменить: спасибо для ответов.
Установить, кажется, быстрее!!!, но он теряет порядок элементов:/
Ответы
Ответ 1
У меня есть библиотека с именем Reactive-Dart, которая содержит много составных операторов для завершающих и не заканчивающихся последовательностей. Для вашего сценария это будет выглядеть примерно так:
final newList = [];
Observable
.fromList(['abc', 'abc', 'def'])
.distinct()
.observe((next) => newList.add(next), () => print(newList));
Уступая:
[abc, def]
Я должен добавить, что есть и другие библиотеки с похожими функциями. Проверьте на github, и я уверен, что вы найдете что-то подходящее.
Ответ 2
Используйте toSet
и затем toList
var ids = [1, 4, 4, 4, 5, 6, 6];
var distinctIds = ids.toSet().toList();
[1, 4, 5, 6]
Ответ 3
Попробуйте использовать пакет запросов.
import 'package:queries/collections.dart';
void main() {
List<String> list = ["a", "a", "b", "c", "b", "d"];
var result = new Collection(list).distinct();
print(result.toList());
}
[a, b, c, d]
Ответ 4
void uniqifyList(List<Dynamic> list) {
for (int i = 0; i < list.length; i++) {
Dynamic o = list[i];
int index;
// Remove duplicates
do {
index = list.indexOf(o, i+1);
if (index != -1) {
list.removeRange(index, 1);
}
} while (index != -1);
}
}
void main() {
List<String> list = ['abc', "abc", 'def'];
print('$list');
uniqifyList(list);
print('$list');
}
Выдает вывод:
[abc, abc, def]
[abc, def]
Ответ 5
Set
работает нормально, но не сохраняет порядок. Вот еще один способ использования LinkedHashSet
:
import "dart:collection";
void main() {
List<String> arr = ["a", "a", "b", "c", "b", "d"];
var result = LinkedHashSet<String>.from(arr).toList();
print(result); // => ["a", "b", "c", "d"]
}
https://api.dart.dev/stable/2.4.0/dart-collection/LinkedHashSet/LinkedHashSet.from.html
Ответ 6
Если вы хотите сохранить порядок или имеете дело с более сложными объектами, чем примитивные типы. Сохраните просмотренные идентификаторы в наборе и отфильтруйте те, которые уже есть в наборе.
final list = ['a', 'a', 'b'];
final seen = Set<String>();
final unique = list.where((str) => seen.add(str)).toList();
print(unique); // => ['a', 'b']
Ответ 7
Как насчет этого простого решения?
List<T> uniqifyList<T>(List<T> list) {
var returnList = List<T>();
for (var item in list) {
if (!returnList.contains(item)) {
returnList.add(item);
}
}
return returnList;
}
Ответ 8
Вот оно рабочее решение:
var sampleList = ['1', '2', '3', '3', '4', '4'];
//print('orignal: $sampleList');
sampleList = Set.of(sampleList).toList();
//print('processed: $sampleList');
Выход:
orignal: [1, 2, 3, 3, 4, 4]
processed: [1, 2, 3, 4]
Ответ 9
Используя дротик 2. 3+, вы можете использовать операторы распространения, чтобы сделать это:
final ids = [1, 4, 4, 4, 5, 6, 6];
final distinctIds = [...{...ids}];
Будь это более или менее читабельно, чем ids.toSet().toList()
, я позволю читателю решить :)