ChatGPT解决这个技术问题 Extra ChatGPT

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

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

如果有人正在寻找要删除的连续字符,请访问 handyopinion.com/…

C
Community

使用 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 更有效。

您可能会发现有用:

Kotlin 习语

标准 Kotlin 库中有哪些 Java 8 Stream.collect 等效项?


您还可以使用开销低于 distincttoSettoMutableSet,如果排序无关紧要,您可以使用 toHashSet
@Buckstabue 如果您只需要返回一个集合(无论是列表还是集合都没有关系),那么使用针对唯一元素优化的集合会更有效。 distinct 的当前实现在其实现中使用 toMutableSet() ,然后通过使用 toSet 等将其转换为 List 。人。直接避免额外的中间集合实例 (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()。所以不用担心性能:-)