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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 14:24:30