Котлин - идиоматический способ удалить повторяющиеся строки из массива?


Ответы:


213

Используйте 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 07

@ mfulton26, конечно, не всегда накладные расходы. Например, объект сущности JPA может иметь ленивые загруженные поля, поэтому более эффективно
разделить

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

1
@ mfulton26, вы правы. В основном я имел в виду, что иногда лучше использовать List + independentBy, чем Set, потому что Set интенсивно использует equals / hashCode, вызов которого потенциально может быть дорогостоящим
Buckstabue

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