string - 如何动态更改 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++
}
解决方案
如果您使用 IDE 调试代码或仅打印语句,您将很快意识到索引i
正在增加,但每次调用的长度newSecret
和减少。因此会给你 Index OutofBoundException。newGuess
deleteCharAt
newSecret[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++
}
推荐阅读
- php - 如何在 Laravel 中手动捕获错误异常
- asp.net - 对象引用未设置为对象的实例在 IIS 6.2 中发布
- javascript - 承诺不返回路线
- ruby-on-rails - 使用设计 CORS 或 CSP 进行 Ember 身份验证?问题
- phpstorm - 在 PhpStorm 中,Ctrl+Click 可以转到 PHP 中的类定义而不是构造函数吗?
- f# - 定义可区分联合的默认值
- java - 使用 Java 8 流如何转换 Map
> 到地图 ? - javascript - 用一个变量索引一个对象的多层次深度
- mysql - 选择在联合中花费大量时间按日期顺序排序?
- javascript - .data() 如何为元素添加数据属性?