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

如何实现按顺序获取指定重复单词在字符串中的起始索引?

解决按顺序查找重复单词的索引问题

没问题,我来帮你搞定这个需求!你遇到的核心问题是indexOf默认只会返回单词的首次出现位置,但我们需要按顺序找到每一个目标单词的下一次出现位置——关键就是每次搜索完一个单词后,更新下一次的搜索起始点,跳过已经匹配过的内容。

实现思路

  1. 维护一个currentSearchStart变量,记录下一次搜索的起始位置,初始值为0。
  2. 遍历你的wordList,对每个单词:
    • 从currentSearchStart位置开始调用indexOf,找到当前单词的起始索引。
    • 计算该单词的结束索引(起始索引 + 单词长度),把单词、起始索引、结束索引存入Triple并加入可变列表。
    • 更新currentSearchStart为当前单词的结束索引,确保下一次搜索从当前单词的后面开始,不会重复匹配之前的内容。

Kotlin 代码实现

fun main() {
    val stringSome = "this is a string and it is a string and it is a new string."
    val wordList = listOf("a", "string", "string", "and", "is")
    
    // 存储单词、起始索引、结束索引的可变列表
    val getIndicesOfAllWords: MutableList<Triple<String, Int, Int>> = mutableListOf()
    var currentSearchStart = 0
    
    for (word in wordList) {
        // 从currentSearchStart开始查找当前单词
        val startIndex = stringSome.indexOf(word, currentSearchStart)
        if (startIndex != -1) {
            val endIndex = startIndex + word.length
            getIndicesOfAllWords.add(Triple(word, startIndex, endIndex))
            // 更新下一次搜索的起始位置,跳过当前单词
            currentSearchStart = endIndex
        } else {
            // 可选:处理单词找不到的情况,比如打印提示或者抛出异常
            println("警告:单词\"$word\"在当前位置之后未找到")
        }
    }
    
    // 验证结果:提取所有起始索引
    val resultStartIndices = getIndicesOfAllWords.map { it.second }
    println("预期起始索引:[8, 10, 30, 37, 44]")
    println("实际起始索引:$resultStartIndices")
}

代码说明

运行这段代码后,你会得到完全符合预期的结果:

  • 第一个"a"从索引0开始找,得到8;
  • 接下来找"string"从8+1=9开始,得到10;
  • 下一个"string"从10+6=16开始,得到30;
  • "and"从30+6=36开始,得到37;
  • 最后一个"is"从37+3=40开始,得到44。

如果你的业务场景需要处理单词找不到的情况,可以在startIndex == -1的分支里添加自定义逻辑,比如跳过该单词或者抛出异常。

内容的提问来源于stack exchange,提问作者Fahad Bilal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:13:40