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.
Вы также можете использовать 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()внутренне. Так что не беспокойтесь о производительности :-)
Ответы:
Используйте
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
вместо aList
и должны быть немного более эффективными, чемdistinct
.Вам могут пригодиться:
источник
toSet
или,toMutableSet
которые имеют меньше накладных расходов, чемdistinct
и, если порядок не имеет значения, вы можете использоватьtoHashSet
.to*Set
более эффективен (пространство и время), чемdistinct[By]
потому, что он возвращаетSet
напрямую, а не используетSet
внутренне и преобразует его в качествеList
возвращаемого значения и 2)distinctBy
является может быть более эффективным, чемdistinct
просто потому, что вы можете избежать сравнения полного равенства объектов. Оба являются действительными пунктами. Я побежал с вашим утверждением, что «конечно, это не всегда накладные расходы», и я отвечал на это и упустил из виду, что вы сравнивалиdistinct
сdistinctBy
(а не сto*Set
).Iterable.distinct
действительно,toMutableSet().toList()
внутренне. Так что не беспокойтесь о производительности :-)