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.

Modificar el valor de los elementos en una lista en Groovy

Tengo una lista de listas. Las listas internas contienen objetos “Car”.

def myList = [ [new Car(model: ".Model1.", year: 2020)] ]

Como puedes ver, el objeto “Car” tiene algunos puntos en su propiedad “modelo” y me gustaría eliminarlos.

Lo que intenté es esto:

myList = myList.collect { it.collect { it.model.replace(".", "") } }

Pero esto no funciona porque al final de esta instrucción obtengo esto:

myList = [ ["Model1"] ]

Esto no es lo que necesito, en realidad necesito los objetos antiguos con solo la propiedad “modelo” actualizada. En mi caso, todavía tendría el objeto “Car” pero con la propiedad “modelo” actualizada a “Model1” en lugar de “.Model1.”. ¿Cómo puedo lograr esto?

Cualquier ayuda es apreciada, gracias.


Una solución que encontré es esta:

myList = myList.collect { it.collect { it.model = it.model.replace(".", ""); return it } }

Como sugirió @cfrick, esto también funciona para mí:

myList.each { it.each { it.model = it.model.replace(".", "") } }

Aunque no estoy seguro si esta es la mejor solución.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Explicación:

    En el enfoque original, estabas usando el método collect que aplica una transformación a cada elemento de la lista y devuelve una nueva lista de elementos transformados. Entonces, cuando aplicas collect dos veces, básicamente obtienes una lista anidada con cada elemento teniendo la cadena del modelo sin puntos.

    En la solución myList.collect { it.collect { ... } }, solo estás transformando la propiedad model de cada objeto car y devolviéndola como una cadena. Por eso obtienes una lista anidada de cadenas.

    Para actualizar los objetos Car originales con la propiedad model modificada, puedes usar el método each que recorre los elementos de la lista y aplica una transformación a cada elemento sin crear una nueva lista. Entonces, la solución actualizada sería:

    myList.each { it.each { it.model = it.model.replace(".", "") } }
    

    Aquí, se utiliza each dos veces para recorrer cada lista anidada y cada objeto Car. La propiedad model de cada objeto car se actualiza en su lugar utilizando el método replace. La lista original myList se modifica con la propiedad model actualizada de cada objeto car.

Comments are closed.