Kotlin的List/Array是否存在类似String.indexOf(CharSequence)的findSublist方法?
Kotlin的List/Array是否存在类似String.indexOf(CharSequence)的findSublist方法?
嘿,问得好!其实Kotlin标准库并没有直接提供一个像String.indexOf(CharSequence)那样专门的findSublist方法哦。不过别担心,咱们可以自己轻松实现一个,或者用现有API组合出同样的效果。
下面给你两种实用的实现方式:
- 基础遍历实现(简单直观)
最直接的思路就是遍历原列表的每一个可能的起始位置,检查从该位置开始的子列表是否和目标子列表完全匹配。代码示例如下:
fun <T> List<T>.findSublistIndex(subList: List<T>): Int { // 空列表默认返回0,和String.indexOf的逻辑保持一致 if (subList.isEmpty()) return 0 // 子列表长度超过原列表,直接返回-1 if (subList.size > this.size) return -1 // 遍历所有可能的起始索引 for (i in 0..this.size - subList.size) { val isMatch = this.subList(i, i + subList.size) == subList if (isMatch) return i } return -1 }
使用起来也很简单,比如:
val originalList = listOf(1, 2, 3, 4, 5) val targetSubList = listOf(3, 4) println(originalList.findSublistIndex(targetSubList)) // 输出2
- Sequence惰性优化(适合大列表)
如果你的原列表数据量很大,上面的基础实现可能会生成不少临时子列表,有点浪费性能。这时候可以用Sequence来做惰性处理,找到第一个匹配项就停止遍历:
fun <T> List<T>.findSublistIndex(subList: List<T>): Int { if (subList.isEmpty()) return 0 val subSize = subList.size if (subSize > size) return -1 return indices.asSequence() .filter { it + subSize <= size } .firstOrNull { i -> // 逐个元素对比,避免生成整个子列表 subList.indices.all { j -> this[i + j] == subList[j] } } ?: -1 }
这个版本不会提前生成所有子列表,而是按需检查每个位置,在大列表场景下性能会更优。
另外要注意:如果你的列表包含可空元素,或者需要自定义元素的相等判断逻辑,记得修改代码里的匹配条件,换成你需要的规则就行~
备注:内容来源于stack exchange,提问作者tpdi
相关产品推荐
相关产品推荐

