val a = arrayOf("a", "a", "b", "c", "c")
val b = a.distinct() // ["a", "b", "c"]
Ada juga distinctByfungsi yang memungkinkan seseorang untuk menentukan cara membedakan item:
val a = listOf("a", "b", "ab", "ba", "abc")
val b = a.distinctBy { it.length } // ["a", "ab", "abc"]
Seperti yang disarankan @ mfulton26 , Anda juga dapat menggunakan toSet, toMutableSetdan, jika Anda tidak memerlukan pemesanan asli untuk dipertahankan toHashSet,. Fungsi-fungsi ini menghasilkan a, Setbukan a Listdan seharusnya sedikit lebih efisien daripada distinct.
Anda juga dapat menggunakan toSetatau toMutableSetyang memiliki lebih sedikit biaya daripada distinctdan jika memesan tidak masalah, Anda dapat menggunakan toHashSet.
mfulton26
@ mfulton26, tentu tidak selalu ada overhead. Misalnya, objek entitas JPA dapat memiliki bidang
pemuatan lambat
2
@Buckstabue Begitu, saya yakin kita sedang berbicara tentang dua masalah yang berbeda: 1) to*Setlebih efisien (ruang & waktu) daripada distinct[By]karena mengembalikan Setsecara langsung daripada menggunakan secara Setinternal dan mengubahnya menjadi Listnilai kembaliannya dan 2) distinctByadalah bisa lebih efisien daripada distincthanya karena Anda dapat menghindari perbandingan persamaan objek penuh. Keduanya adalah poin yang valid. Saya berlari dengan pernyataan Anda bahwa "pasti itu tidak selalu memiliki overhead" dan saya membalasnya dan mengabaikan bahwa Anda membandingkan distinctdengan distinctBy(dan tidak dengan to*Set).
mfulton26
1
@ mfulton26, Anda benar. Maksud saya, terkadang lebih baik menggunakan List + differentBy daripada Set, karena Set secara intensif menggunakan equals / hashCode yang berpotensi mahal untuk dipanggil
Buckstabue
1
Pada saat penulisan, Iterable.distinctsebenarnya dilakukan secara toMutableSet().toList()internal. Jadi jangan khawatir tentang kinerja :-)
Jawaban:
Gunakan
distinct
fungsi ekstensi :val a = arrayOf("a", "a", "b", "c", "c") val b = a.distinct() // ["a", "b", "c"]
Ada juga
distinctBy
fungsi yang memungkinkan seseorang untuk menentukan cara membedakan item:val a = listOf("a", "b", "ab", "ba", "abc") val b = a.distinctBy { it.length } // ["a", "ab", "abc"]
Seperti yang disarankan @ mfulton26 , Anda juga dapat menggunakan
toSet
,toMutableSet
dan, jika Anda tidak memerlukan pemesanan asli untuk dipertahankantoHashSet
,. Fungsi-fungsi ini menghasilkan a,Set
bukan aList
dan seharusnya sedikit lebih efisien daripadadistinct
.Anda mungkin menemukan berguna:
sumber
toSet
atautoMutableSet
yang memiliki lebih sedikit biaya daripadadistinct
dan jika memesan tidak masalah, Anda dapat menggunakantoHashSet
.to*Set
lebih efisien (ruang & waktu) daripadadistinct[By]
karena mengembalikanSet
secara langsung daripada menggunakan secaraSet
internal dan mengubahnya menjadiList
nilai kembaliannya dan 2)distinctBy
adalah bisa lebih efisien daripadadistinct
hanya karena Anda dapat menghindari perbandingan persamaan objek penuh. Keduanya adalah poin yang valid. Saya berlari dengan pernyataan Anda bahwa "pasti itu tidak selalu memiliki overhead" dan saya membalasnya dan mengabaikan bahwa Anda membandingkandistinct
dengandistinctBy
(dan tidak denganto*Set
).Iterable.distinct
sebenarnya dilakukan secaratoMutableSet().toList()
internal. Jadi jangan khawatir tentang kinerja :-)