You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin是否有内置方法移除数组相邻重复元素并保留顺序?

Kotlin过滤相邻重复元素的实现方案

嘿,这个需求挺常见的!Kotlin标准库本身没有专门的内置方法直接过滤相邻重复元素,但用现有工具可以非常简洁地实现,而且完全支持你说的自定义对象(只要正确实现了equals()方法)。

基础实现:用fold快速处理

fold是标准库中非常实用的聚合函数,我们可以用它来遍历原集合,只保留和前一个元素不相等的项:

整数示例

val original = listOf(1,1,1,2,2,1,1,1,1,2,2,3)
val result = original.fold(mutableListOf<Int>()) { acc, current ->
    // 检查当前元素和结果列表最后一项是否不同
    if (acc.lastOrNull() != current) {
        acc.add(current)
    }
    acc
}
println(result) // 输出: [1, 2, 1, 2, 3]

自定义对象示例

假设你有一个实现了equals()的自定义类(比如data class会自动生成正确的equals和hashCode):

// 自定义对象,这里用data类自动实现equals
data class Item(val id: String, val name: String)

val originalItems = listOf(
    Item("A", "Apple"), Item("A", "Apple"),
    Item("B", "Banana"), Item("B", "Banana"),
    Item("A", "Apple"), Item("C", "Cherry")
)

val filteredItems = originalItems.fold(mutableListOf<Item>()) { acc, current ->
    if (acc.lastOrNull() != current) {
        acc.add(current)
    }
    acc
}
// 结果: [Item(id=A, name=Apple), Item(id=B, name=Banana), Item(id=A, name=Apple), Item(id=C, name=Cherry)]

进阶:惰性序列处理(适合大数据集)

如果你的集合数据量很大,用sequence实现惰性处理可以避免一次性加载所有元素到内存,效率更高:

// 给Iterable扩展一个自定义方法
fun <T> Iterable<T>.distinctAdjacent(): Sequence<T> = sequence {
    var previous: T? = null
    for (element in this@distinctAdjacent) {
        if (element != previous) {
            yield(element)
            previous = element
        }
    }
}

// 使用方式
val original = listOf(1,1,1,2,2,1,1,1,1,2,2,3)
val result = original.distinctAdjacent().toList()

关键说明

  • 所有实现都依赖元素的equals()方法判断是否相等,所以只要你的自定义对象正确实现了equals()(注意遵循equals的约定,比如对称性、传递性等),就能正常工作。
  • 标准库没有内置这个方法是因为需求相对特定,但通过基础函数的组合,我们可以轻松实现符合自己需求的逻辑,灵活性更高。

内容的提问来源于stack exchange,提问作者Ian Newson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:46:46