Kotlin - Cara idiomatis untuk menghapus string duplikat dari array?


Jawaban:


213

Gunakan distinctfungsi ekstensi :

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 mungkin menemukan berguna:


5
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 :-)
Luke
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.