Antworten:
Verwenden Sie die distinct
Erweiterungsfunktion :
val a = arrayOf("a", "a", "b", "c", "c")
val b = a.distinct() // ["a", "b", "c"]
Es gibt auch eine distinctBy
Funktion , 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
, toMutableSet
und wenn Sie, zu konservierenden nicht die ursprüngliche Bestellung benötigen toHashSet
. Diese Funktionen erzeugen a Set
anstelle von a List
und sollten etwas effizienter sein als distinct
.
Sie können nützlich finden:
toSet
oder toMutableSet
die weniger Overhead haben als distinct
und wenn die Bestellung keine Rolle spielt, können Sie verwenden toHashSet
.
to*Set
ist effizienter (Raum & Zeit) als distinct[By]
weil es das Set
direkt zurückgibt, anstatt ein Set
internes zu verwenden und es in ein List
als Rückgabewert umzuwandeln und 2) distinctBy
ist kann effizienter sein als distinct
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 Sie distinct
mit distinctBy
(und nicht mit to*Set
) verglichen haben .
Iterable.distinct
tatsächlich toMutableSet().toList()
intern. Also mach dir keine Sorgen um die Leistung :-)