在 Kotlin ("Val cannot be reasigned") 中遍历列表元素时如何修改它们?

How to modify elements of a list as I iterate through them in Kotlin ("Val cannot be reasigned")?

我正在尝试制作一个 kotlin 函数,它给定一个数字列表和另一个单独的数字,将遍历列表,从每个元素中减去一个,然后在列表末尾添加另一个元素,如果条件是遇见了。这是我的代码:

fun listCalculator(myList:MutableList<Int>, number:Int) {

for (i in 0..number){

     val iterator = myList.listIterator()
     for (item in iterator) {

         item -= 1

         if (item == 0) {iterator.add(10)}
         println(myList.toString())

}}}

这是我传递给函数的列表:

var testList:MutableList<Int> = mutableListOf(1,7,0,1)

我 运行 遇到的第一个错误是在第 5 行,当时我试图从 item 的值中减去 1:'Val cannot be reassigned'。我遇到的第二个问题是此代码在满足 (item == 0) 条件的元素之后添加了新元素 10,但我希望它位于列表的末尾。

首先,当遍历集合时,我们不会收到某种指向当前项的指针。 item 在您的示例中只是当前项目的副本,修改它不会影响列表。这是 item 是只读的原因之一——否则会产生误导,因为开发人员会认为他们修改了列表,但实际上他们没有。为了替换当前项目,我们必须使用 ListIterator.set() 或使用其索引访问该项目。

其次,在遍历同一个集合的同时在末尾添加新项目会很棘手。只记住 0 个项目的数量并在我们完成迭代后添加 10 个项目要容易得多。

使用ListIterator.set()的解决方案:

fun listCalculator(myList: MutableList<Int>, number: Int) {
    for (i in 0..number) {
        var counter = 0
        val iterator = myList.listIterator()
        for (item in iterator) {
            iterator.set(item - 1)

            if (item == 1) {
                counter++
            }
        }

        repeat(counter) { myList += 10 }
    }
}

我们迭代索引并手动访问当前项目的解决方案:

fun listCalculator(myList: MutableList<Int>, number: Int) {
    for (i in 0..number) {
        var counter = 0
        for (index in myList.indices) {
            val item = --myList[index]

            if (item == 0) {
                counter++
            }
        }

        repeat(counter) { myList += 10 }
    }
}

还要注意外层循环不是运行number次,而是number + 1次。如果你打算执行它 number 次,那么你必须使用 for (i in 0 until number) { ... } 或者只是: repeat(number) { ... }