Antworten:
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:
toSetoder toMutableSetdie weniger Overhead haben als distinctund wenn die Bestellung keine Rolle spielt, können Sie verwenden toHashSet.
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 .
Iterable.distincttatsächlich toMutableSet().toList()intern. Also mach dir keine Sorgen um die Leistung :-)