【问题标题】:Kotlin - Idiomatic way to remove duplicate strings from array?Kotlin - 从数组中删除重复字符串的惯用方法?
【发布时间】:2017-03-18 17:42:03
【问题描述】:

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

【问题讨论】:

标签: algorithm kotlin


【解决方案1】:

使用distinct extension function

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

还有distinctBy function 允许指定如何区分项目:

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

正如@mfulton26 建议的那样,您也可以使用toSettoMutableSet,如果您不需要保留原始顺序,则可以使用toHashSet。这些函数会生成 Set 而不是 List,并且应该比 distinct 更高效。


您可能会觉得有用:

【讨论】:

  • 您也可以使用toSettoMutableSet,它们的开销低于distinct,如果订购不重要,您可以使用toHashSet
  • @Buckstabue 如果您只需要一个集合返回(并且它是列表还是集合都没有关系),那么使用针对唯一元素优化的集合会更有效。 distinct 的当前实现在其实现中使用 toMutableSet() ,然后通过使用 toSet 等将其转换为 List 。人。直接避免额外的中介 Collection 实例 (kotlin/_Arrays.kt:9145-9155 at master · JetBrains/kotlin)。
  • @Buckstabue 我明白了,我相信我们在谈论两个不同的问题:1) to*Setdistinct[By] 更有效(空间和时间),因为它直接返回 Set在内部使用 Set 并将其转换为 List 作为其返回值和 2) distinctBy 可能比 distinct 更有效,因为您可以避免完整的对象相等比较。两者都是有效点。我接受了您的陈述,即“当然它并不总是有开销”,我正在回复这个问题并忽略了您将 distinctdistinctBy 进行比较(而不是与 to*Set 进行比较)。
  • @mfulton26,你是对的。我的主要意思是有时使用 List + distinctBy 比使用 Set 更好,因为 Set 密集使用 equals/hashCode,这可能调用起来可能很昂贵
  • 在撰写本文时,Iterable.distinct 实际上在内部执行toMutableSet().toList()。所以不用担心性能:-)
猜你喜欢
  • 1970-01-01
  • 2016-11-17
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 2012-05-09
  • 2012-09-15
  • 1970-01-01
相关资源
最近更新 更多