在 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) { ... }
我正在尝试制作一个 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) { ... }