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 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 :-)
Antworten:
Verwenden Sie die
distinct
Erweiterungsfunktion :Es gibt auch eine
distinctBy
Funktion , mit der man festlegen kann, wie die Elemente unterschieden werden sollen:Wie @ mfulton26 vorgeschlagen, können Sie auch
toSet
,toMutableSet
und wenn Sie, zu konservierenden nicht die ursprüngliche Bestellung benötigentoHashSet
. Diese Funktionen erzeugen aSet
anstelle von aList
und sollten etwas effizienter sein alsdistinct
.Sie können nützlich finden:
quelle
toSet
odertoMutableSet
die weniger Overhead haben alsdistinct
und wenn die Bestellung keine Rolle spielt, können Sie verwendentoHashSet
.to*Set
ist effizienter (Raum & Zeit) alsdistinct[By]
weil es dasSet
direkt zurückgibt, anstatt einSet
internes zu verwenden und es in einList
als Rückgabewert umzuwandeln und 2)distinctBy
ist kann effizienter sein alsdistinct
nur, 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 Siedistinct
mitdistinctBy
(und nicht mitto*Set
) verglichen haben .Iterable.distinct
tatsächlichtoMutableSet().toList()
intern. Also mach dir keine Sorgen um die Leistung :-)