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

jtu*_*lla 67 algorithm kotlin

如何从Array<String?>kotlin中删除重复项?

hot*_*key 138

使用distinct扩展功能:

val a = arrayOf("a", "a", "b", "c", "c")
val b = a.distinct() // ["a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)

还有一个distinctBy功能,允许人们指定如何区分项目:

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

正如@ mfulton26建议的那样,你也可以使用toSet,toMutableSet如果你不需要保留原始的顺序,toHashSet.这些函数产生的Set不是a List而且应该比它更有效distinct.


你可能会觉得有用:

  • 在撰写本文时,“Iterable.distinct”实际上在内部执行“toMutableSet().toList()”。所以不用担心性能:-) (4认同)
  • @Buckstabue 我明白了,我相信我们在谈论两个不同的问题:1) `to*Set` 比 `distinct[By]` 更有效(空间和时间),因为它直接返回 `Set` 而不是使用`Set` 内部并将其转换为 `List` 作为其返回值和 2) `distinctBy` 比 `distinct` 更有效,因为您可以避免完整的对象相等比较。两者都是有效点。我用你的说法“当然它并不总是有开销”,我在回答这个问题时忽略了你将 `distinct` 与 `distinctBy`(而不是与 `to*Set`)进行比较。 (3认同)
  • 您也可以使用`toSet`或`toMutableSet`,它们的开销要比`distinct`少,并且如果排序无关紧要,可以使用`toHashSet`。 (2认同)