Kotlin - Idiomatische Möglichkeit, doppelte Zeichenfolgen aus dem Array zu entfernen?


Antworten:


196

Verwenden Sie die distinctErweiterungsfunktion :

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

Es gibt auch eine distinctByFunktion , mit der man festlegen kann, wie die Elemente unterschieden werden sollen:

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

Wie @ mfulton26 vorgeschlagen, können Sie auch toSet, toMutableSetund wenn Sie, zu konservierenden nicht die ursprüngliche Bestellung benötigen toHashSet. Diese Funktionen erzeugen a Setanstelle von a Listund sollten etwas effizienter sein als distinct.


Sie können nützlich finden:


5
Sie können auch verwenden toSetoder toMutableSetdie weniger Overhead haben als distinctund wenn die Bestellung keine Rolle spielt, können Sie verwenden toHashSet.
mfulton26

@ mfulton26, sicherlich hat es nicht immer Overhead. Zum Beispiel kann ein JPA-Entitätsobjekt träge geladene Felder haben, so dass es effizienter ist, seine Sammlung nach ID zu unterscheiden, als einen vollständigen Vergleich durchzuführen
Buckstabue

2
@Buckstabue Ich sehe, ich glaube, wir sprechen über zwei verschiedene Probleme: 1) to*Setist effizienter (Raum & Zeit) als distinct[By]weil es das Setdirekt zurückgibt, anstatt ein Setinternes zu verwenden und es in ein Listals Rückgabewert umzuwandeln und 2) distinctByist kann effizienter sein als distinctnur, weil Sie einen vollständigen Vergleich der Objektgleichheit vermeiden können. Beides sind gültige Punkte. Ich lief mit Ihrer Aussage, dass "es sicherlich nicht immer Overhead hat" und ich antwortete darauf und übersah, dass Sie distinctmit distinctBy(und nicht mit to*Set) verglichen haben .
mfulton26

1
@ mfulton26, du bist richtig. Ich meinte meistens, dass es manchmal besser ist, List + uniqueBy als Set zu verwenden, da Set intensiv equals / hashCode verwendet, dessen Aufruf möglicherweise teuer sein könnte
Buckstabue

1
Zum Zeitpunkt des Schreibens Iterable.distincttatsächlich toMutableSet().toList()intern. Also mach dir keine Sorgen um die Leistung :-)
Luke
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.