Kotlin中如何重启for循环?嵌套字符匹配循环场景求助
解决Kotlin中嵌套循环匹配字符并重启内层循环的问题
我来帮你搞定这个问题!你想要实现的是:对比两个字符串的字符,一旦找到匹配项就从两个字符串中移除该字符,然后让S2的循环从头开始重新检查。原代码的问题主要在于用了不可变的String和固定的for循环索引——String不可变导致修改后原索引失效,而for循环的遍历范围是固定的,没法轻松重启内层循环。
解决方案思路
核心是改用**可变集合(MutableList)**来存储字符(方便动态移除元素),同时用while循环替代for循环,这样可以灵活控制遍历的索引,实现内层循环重启的需求。
完整代码示例
fun main() { // 将字符串转为可变列表,方便动态移除元素 var s1 = "abcdef".toMutableList() var s2 = "bfihja".toMutableList() var i = 0 // 遍历s1的元素,用while循环适配动态变化的列表长度 while (i < s1.size) { var matchFound = false var j = 0 // 遍历s2,找到匹配就移除并重启内层循环 while (j < s2.size) { if (s1[i] == s2[j]) { // 移除两个列表中的匹配字符 s1.removeAt(i) s2.removeAt(j) matchFound = true break // 跳出内层循环,下一次会从j=0重新开始 } j++ } // 如果没找到匹配,才移动到s1的下一个元素 if (!matchFound) { i++ } // 如果找到匹配,i保持不变——因为s1移除了当前元素,下一个元素自动到了i的位置 } // 输出结果 println("处理后的s1: ${s1.joinToString("")}") println("处理后的s2: ${s2.joinToString("")}") }
代码解释
- 可变集合的使用:
toMutableList()把不可变的String转成可变列表,这样我们可以直接修改集合内容,而不是每次生成新的字符串。 - 外层while循环:控制s1的遍历索引
i,只有当没找到匹配时,才让i自增——因为如果找到匹配并移除了s1的当前元素,原下一个元素会自动移到i的位置,需要继续用这个元素和新的s2从头匹配。 - 内层while循环:遍历s2的索引
j,一旦找到匹配项,就移除两个列表中的对应元素,标记matchFound为true并跳出内层循环。这样下一次进入内层循环时,j会从0重新开始,实现了“重启S2循环”的需求。
运行结果
对于你的输入字符串,运行后会输出:
处理后的s1: cde 处理后的s2: ihj
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

