Cómo modificar elementos de una lista mientras itero a través de ellos en Kotlin (“Val no puede ser reasignado”)?
Estoy tratando de hacer una función en kotlin que, dada una lista de números y otro número separado, recorrerá la lista restando uno a cada elemento, y luego agregará otro elemento al final de la lista si se cumple una condición. Este es mi código:
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())
}}}
Y esta es la lista que estoy pasando a la función:
var testList:MutableList<int> = mutableListOf(1,7,0,1)
El primer error que encuentro ocurre en la línea 5, cuando trato de restar 1 al valor de item
: Val no puede ser reasignado
. El segundo problema que tengo es que este código agrega el nuevo elemento 10
justo después del elemento que cumple la condición (item == 0)
, pero quiero que esté al final de la lista.
davy.ai
Posible solución al problema
Para corregir el primer error, podemos cambiar
val
avar
, lo cual permitirá volver a asignar un valor:De esta manera creamos una nueva variable con el valor actualizado y utilizamos la función
set
delListIterator
para actualizar el valor en la lista. Esto también evitará modificar la lista original mientras se itera sobre ella.Para corregir el segundo problema, podemos mover el
iterator.add(10)
fuera del bucle y utilizarlo después de que el bucle haya terminado. De esta manera agregamos el nuevo elemento al final de la lista. Además, podemos eliminar la declaraciónprintln
, que imprime la lista después de cada iteración y no es necesaria.Con estos cambios, la función final iterará sobre la lista, restando uno a cada elemento y agregando un nuevo elemento al final si algún elemento es cero. El parámetro
number
controla el número de iteraciones, lo cual puede ser útil para propósitos de prueba.Ejemplo de uso
Podemos utilizar la función con el ejemplo
testList
:Esto producirá la siguiente salida:
Lo cual muestra la lista después de cada iteración y la lista final con el nuevo elemento al final.