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
相关产品推荐
相关产品推荐

