Kotlin - Modo idiomatico per rimuovere le stringhe duplicate dall'array?


Risposte:


202

Usa la distinctfunzione di estensione :

val a = arrayOf("a", "a", "b", "c", "c")
val b = a.distinct() // ["a", "b", "c"]

C'è anche una distinctByfunzione che permette di specificare come distinguere gli elementi:

val a = listOf("a", "b", "ab", "ba", "abc")
val b = a.distinctBy { it.length } // ["a", "ab", "abc"]

Come @ mfulton26 suggerito, è anche possibile utilizzare toSet, toMutableSete, se non è necessario l'ordinamento originale da conservare, toHashSet. Queste funzioni producono a Setinvece di a Liste dovrebbero essere un po 'più efficienti di distinct.


Potresti trovare utile:


5
Puoi anche usare toSeto toMutableSetche hanno meno overhead di distincte se l'ordine non è importante puoi usare toHashSet.
mfulton26

@ mfulton26, di certo non sempre ha un overhead. Ad esempio, un oggetto entità JPA può avere campi caricati in modo pigro, quindi è più efficiente distinguere la sua raccolta in base
all'ID

2
@Buckstabue vedo, credo che stiamo parlando di due problemi diversi: 1) to*Setè più efficiente (spazio e tempo) rispetto al distinct[By]fatto che restituisce Setdirettamente invece di utilizzare Setinternamente e convertirlo in a Listcome valore di ritorno e 2) distinctByè può essere più efficiente del distinctsemplice perché puoi evitare il confronto completo dell'uguaglianza degli oggetti. Entrambi sono punti validi. Mi sono imbattuto con la tua affermazione che "certamente non sempre ha un sovraccarico" e stavo rispondendo a questo e ho trascurato che stavi confrontando distinctcon distinctBy(e non con to*Set).
mfulton26

1
@ mfulton26, hai ragione. Per lo più intendevo che a volte è meglio usare List + separateBy rispetto a Set, perché Set usa intensamente equals / hashCode che potenzialmente potrebbe essere costoso da chiamare
Buckstabue

1
Al momento della scrittura, in Iterable.distinctrealtà lo fa toMutableSet().toList()internamente. Quindi non preoccuparti per la performance :-)
Luke il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.