Jak usunąć duplikaty z Array<String?>
kotlina?
Odpowiedzi:
Użyj distinct
funkcji rozszerzenia :
val a = arrayOf("a", "a", "b", "c", "c")
val b = a.distinct() // ["a", "b", "c"]
Istnieje również distinctBy
funkcja, która pozwala określić, jak rozróżnić elementy:
val a = listOf("a", "b", "ab", "ba", "abc")
val b = a.distinctBy { it.length } // ["a", "ab", "abc"]
Jak @ mfulton26 zasugerował, można również używać toSet
, toMutableSet
a jeśli nie trzeba oryginalną kolejność być zachowane, toHashSet
. Te funkcje tworzą Set
zamiast a List
i powinny być nieco bardziej wydajne niż distinct
.
Może ci się przydać:
toSet
lub toMutableSet
które mają mniejszy narzut niż, distinct
a jeśli zamówienie nie ma znaczenia, możesz użyć toHashSet
.
to*Set
jest bardziej wydajne (przestrzeń i czas) niż distinct[By]
dlatego, że zwraca Set
bezpośrednio, zamiast używać Set
wewnętrznie i konwertować je na a List
jako wartość zwracaną i 2) distinctBy
jest może być bardziej wydajne niż distinct
po prostu dlatego, że można uniknąć pełnego porównania równości obiektów. Oba są ważnymi punktami. Pobiegłem z twoim stwierdzeniem, że „z pewnością nie zawsze ma narzuty” i odpowiadałem na to i przeoczyłem, że porównujesz się distinct
z distinctBy
(a nie z to*Set
).
Iterable.distinct
faktycznie działa toMutableSet().toList()
wewnętrznie. Więc nie martw się o wydajność :-)