Kotlin 1.3.31:无法获取字符串重复字符索引,连续重复统计出错
看来你遇到的核心问题是遍历字符时无法定位到当前重复字符的实际索引,导致统计右侧重复次数出错。咱们先拆解原代码的几个问题,再给出修正方案:
原代码的问题分析
- 遍历方式错误:
for (Left in str)只能拿到字符值,无法获取当前字符在字符串中的具体索引。当字符重复时(比如"abba"里的第二个'b'),str.indexOf(Left, Last)会返回该字符之前出现的索引,而非当前遍历到的那个字符的索引,导致统计范围错误。 - 索引越界风险:
i in index..len中,len如果是str.length的话,会超出字符串的最大索引(字符串索引从0到str.lastIndex),触发IndexOutOfBoundsException。 - Last变量更新逻辑错误:每次循环后把
Last设为当前字符的索引,但无法匹配for (Left in str)遍历到的重复字符的实际位置,导致后续indexOf始终指向之前的索引。
修正方案:遍历索引而非字符
直接遍历字符串的索引,这样可以明确当前处理的是第i个位置的字符,然后统计该位置**右侧(i+1到末尾)**的重复次数:
val str = "your test string" // 替换成你的目标字符串 val lastIndex = str.lastIndex for (i in 0..lastIndex) { val currentChar = str[i] var repeatCount = 0 // 从当前位置的下一个位置开始遍历到末尾 for (j in i + 1..lastIndex) { // ignoreCase = true 表示忽略大小写,不需要的话可以去掉 if (currentChar.equals(str[j], ignoreCase = true)) { repeatCount++ } } println("The Char '$currentChar' repeats $repeatCount times on the right") }
为什么这个方案可行?
- 每个索引
i对应字符串中唯一的位置,不管字符是否重复,都能精准定位当前要统计的字符。 - 从
i+1开始遍历,确保只统计当前字符右侧的内容,不会把自己算进去。 - 避免了indexOf无法定位重复字符实际位置的问题,逻辑更清晰直观。
测试示例
如果输入字符串是"abba",运行结果会是:
The Char 'a' repeats 1 times on the right The Char 'b' repeats 1 times on the right The Char 'b' repeats 0 times on the right The Char 'a' repeats 0 times on the right
完全符合每个位置字符的右侧重复次数统计需求。
内容的提问来源于stack exchange,提问作者Jimit Bhatt
相关产品推荐
相关产品推荐

