Kotlin - Ідіоматичний спосіб видалити повторювані рядки з масиву?


Відповіді:


202

Використовуйте функцію distinctрозширення :

val a = arrayOf("a", "a", "b", "c", "c")
val b = a.distinct() // ["a", "b", "c"]

Існує також distinctByфункція, яка дозволяє вказати, як відрізнити елементи:

val a = listOf("a", "b", "ab", "ba", "abc")
val b = a.distinctBy { it.length } // ["a", "ab", "abc"]

Як @ mfulton26 запропонував, ви можете також використовувати toSet, toMutableSetі, якщо вам не потрібен оригінальний порядок в цілості й схоронності toHashSet. Ці функції створюють Setзамість a Listі повинні бути трохи ефективнішими, ніж distinct.


Вам може виявитися корисним:


5
Ви також можете використовувати toSetабо, toMutableSetякі мають менше накладних витрат, ніж, distinctі якщо замовлення не має значення, ви можете використовувати toHashSet.
mfulton26,

@ mfulton26, звичайно, це не завжди має накладні витрати. Наприклад, об'єкт сутності JPA може мати ледаче завантажені поля, тому ефективніше розрізняти його колекцію за ідентифікатором, ніж виконувати повне порівняння
Buckstabue,

2
@Buckstabue Я бачу, я вважаю, що ми говоримо про дві різні проблеми: 1) to*Setє більш ефективним (простір і час), ніж distinct[By]тому, що повертає Setбезпосередньо замість внутрішнього використання Setі перетворюючи його на а Listяк його повернене значення і 2) distinctByє може бути ефективнішим, ніж distinctпросто тому, що ви можете уникнути повного порівняння рівності об’єктів. Обидва дійсних бали. Я побіг з вашим твердженням, що "звичайно, це не завжди має накладні витрати", і я відповів на це і пропустив, що ви порівнювали distinctз distinctBy(а не з to*Set).
mfulton26,

1
@ mfulton26, ти маєш рацію. Я здебільшого мав на увазі, що іноді краще використовувати List + distinctBy, ніж Set, оскільки Set інтенсивно використовує equals / hashCode, що потенційно може бути дорогим для дзвінка
Buckstabue

1
На момент написання статті Iterable.distinctфактично робить toMutableSet().toList()внутрішньо. Тож не турбуйтеся про виступ :-)
Лука
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.