Kotlin-从数组中删除重复字符串的惯用方式?


Answers:


197

使用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建议的那样,您也可以使用toSettoMutableSet如果不需要保留原始顺序,也可以使用toHashSet。这些函数产生a Set而不是a,List并且应该比效率更高distinct


您可能会发现有用的:


5
您也可以使用toSettoMutableSet,其开销要小于distinct和如果订购无关紧要,则可以使用toHashSet
mfulton16年

@ mfulton26,当然它并不总是有开销。例如,JPA实体对象可以具有延迟加载的字段,因此按ID区分其集合比执行完全比较更为有效
Buckstabue

2
@Buckstabue我明白了,我相信我们在谈论两个不同的问题:1)to*Set比更有效(空间和时间)distinct[By],因为它返回的Set,而不是直接使用Set内部并将其转换为一个List作为它的返回值和2)distinctBy是比distinct仅仅因为可以避免完整的对象相等性比较而效率更高。两者都是有效点。我赞同您的说法,“肯定不是总是有开销的”,而我在答复时却忽略了您distinctdistinctBy(而不是与to*Set)进行比较。
mfulton26 '19

1
@ mfulton26,您是对的。我的主要意思是,有时使用List + distinctBy比使用Set更好,因为Set大量使用equals / hashCode调用可能很昂贵
Buckstabue

1
在撰写本文时,Iterable.distinct实际上是在toMutableSet().toList()内部进行的。因此,不必担心性能问题:-)
路加福音
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.