首页 > 解决方案 > 如何动态更改 Kotlin 循环中的条件

问题描述

我的任务是从两个字符串中一个一个地删除字母,如果有相等并保持在相同的位置。我这样做并且总是让索引超出界限异常。无法理解如何修复索引并动态制作我的高板。

   var newSecret = StringBuilder(secret)
    var newGuess = StringBuilder(guess)    

 for (i in newSecret.indices){
            if (newSecret[i]==newGuess[i]){
                newSecret.deleteCharAt(i)
                newGuess.deleteCharAt(i)
                rightPosition++
    
            }

标签: stringloopsfor-loopkotlinconditional-statements

解决方案


如果您使用 IDE 调试代码或仅打印语句,您将很快意识到索引i正在增加,但每次调用的长度newSecret和减少。因此会给你 Index OutofBoundException。newGuessdeleteCharAtnewSecret[i]

@gidds 在评论中的很好解释:newSecret.indices在循环之前只评估一次 - 删除字符时不会重新评估范围,这是异常的原因

for 循环可能不适合此用例,您可以尝试使用 while 循环。您必须使用两个字符串的长度检查索引,并且i仅在需要时增加

  val newSecret = StringBuilder("abcdef")
  val newGuess = StringBuilder("abddeg")

  var i = 0
  while(i<newSecret.length && i < newGuess.length) {
    if (newSecret[i] == newGuess[i]) {
      newSecret.deleteCharAt(i)
      newGuess.deleteCharAt(i)
    }
    else i++
  }

推荐阅读