科特林错误 "Index Out Of Bounds Exception"

Kotlin error "Index Out Of Bounds Exception"

我是 Kotlin 的新手,也是编程的新手,所以请保持温柔 :)

假设我有一个字符串(它被优化为没有任何重复的字符),我想将该字符串中的所有字符与声明为可变字符列表的字母表进行比较。我想删除字符串中出现的字母表中的任何字符。我的代码如下

var alphabet=mutableListOf('a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','r','s','t','u','v','w','x','y','z') 
    var key="keyword"
    println(key)    
    for (i in key.indices)
        {for (j in alphabet.indices)
             {if (key[i] == alphabet[j])
                  alphabet.removeAt(j)     // 1. this line have error
                  //print(alphabet[j])  //2. but this line runs fine
}}}

在上面的代码中,我在“alphabet.removeAt(j)”命令中出错,所以我尝试了另一个命令来打印出字符而不是删除它们,它运行良好。我读了一些文章,我知道这个错误与无效索引有关,但我使用了“索引”键,我认为它很安全。请帮忙

您可以将整个循环简化为:

alphabet.retainAll{ it !in key })

alphabet.retainAll { !key.contains(it) }

或者如果您希望过滤后的列表成为新列表而不是就地执行:

val filtered = alphabet.filter { it !in key }

使用 alphabet.indices 进行迭代是安全的,但是在修改集合的同时对其进行迭代是不安全的。请注意,indices 返回了完整字母表的索引,但随后您从中删除了一些项目,使其更短,因此索引不再有效。

您无需遍历集合即可找到要删除的项目。你可以这样做:

alphabet.remove(key[i])

但老实说,您不需要执行任何操作。你的问题实际上是两个集合的减法,你可以更容易地解决它:

('a'..'z').toSet() - "keyword".toSet()

but I used the "indices" key and I think it's pretty safe

好吧,indices 集合仅在进入循环时 一次 求值,而不是在每次迭代开始时求值。即使您在内层循环中更改 alphabet 的大小,内层循环仍将循环相同的次数,因为它不会再次计算 alphabet.indices 。它只会在外循环的下一次迭代中再次执行此操作,但您的代码会在此之前抛出异常。

除了每次删除项目时减少 j 之外,您还可以通过

解决此问题
key.forEach(alphabet::remove)