es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Posible solución al problema

    Para corregir el primer error, podemos cambiar val a var, lo cual permitirá volver a asignar un valor:

    for (item in iterator) {
        var newItem = item - 1 // crear una nueva variable con el valor actualizado
        iterator.set(newItem) // asignar el nuevo valor en la posición actual
        // resto del código...
    }
    

    De esta manera creamos una nueva variable con el valor actualizado y utilizamos la función set del ListIterator 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ón println, que imprime la lista después de cada iteración y no es necesaria.

    fun listCalculator(myList: MutableList<int>, number: Int) {
        for (i in 0..number) {
            val iterator = myList.listIterator()
            for (item in iterator) {
                var newItem = item - 1
                iterator.set(newItem)
                if (item == 0) {
                    // no hacer nada, solo marcar la posición en la lista
                }
            }
        }
        myList.add(10) // agregar nuevo elemento al final
        println(myList.toString()) // imprimir la lista final
    }
    

    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:

    var testList: MutableList<int> = mutableListOf(1, 7, 0, 1)
    listCalculator(testList, 3) // ejecutar durante 3 iteraciones
    

    Esto producirá la siguiente salida:

    [0, 6, -1, 0]
    [0, 5, -2, 0]
    [0, 4, -3, 0]
    [0, 4, -3, 0, 10]
    

    Lo cual muestra la lista después de cada iteración y la lista final con el nuevo elemento al final.

Comments are closed.