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

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("")}")
}

代码解释

  1. 可变集合的使用:toMutableList()把不可变的String转成可变列表,这样我们可以直接修改集合内容,而不是每次生成新的字符串。
  2. 外层while循环:控制s1的遍历索引i,只有当没找到匹配时,才让i自增——因为如果找到匹配并移除了s1的当前元素,原下一个元素会自动移到i的位置,需要继续用这个元素和新的s2从头匹配。
  3. 内层while循环:遍历s2的索引j,一旦找到匹配项,就移除两个列表中的对应元素,标记matchFound为true并跳出内层循环。这样下一次进入内层循环时,j会从0重新开始,实现了“重启S2循环”的需求。

运行结果

对于你的输入字符串,运行后会输出:

处理后的s1: cde
处理后的s2: ihj

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:02:41