如何实现按顺序获取指定重复单词在字符串中的起始索引?
解决按顺序查找重复单词的索引问题
没问题,我来帮你搞定这个需求!你遇到的核心问题是indexOf默认只会返回单词的首次出现位置,但我们需要按顺序找到每一个目标单词的下一次出现位置——关键就是每次搜索完一个单词后,更新下一次的搜索起始点,跳过已经匹配过的内容。
实现思路
- 维护一个
currentSearchStart变量,记录下一次搜索的起始位置,初始值为0。 - 遍历你的
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
相关产品推荐
相关产品推荐

