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 eliminar un elemento del iterador si la condición depende de la propiedad del objeto en el que se basa el iterador?

Permítanme explicar:

Necesito poder iterar sobre una lista de objetos. Cada uno de los objetos tiene una propiedad que es una lista, y tengo que comprobar si esa lista contiene algún elemento que no esté en otra lista.

Cuando intenté hacerlo usando bucles for anidados, seguía dando excepciones de modificación concurrente, así que intenté usar un iterador, pero ahora estoy atascado, ya que si hago un iterador basado en la lista de objetos, no puedo acceder a las propiedades individuales del objeto para luego iterar sobre ellas.

Aquí hay algún código de ejemplo de lo que estaba intentando lograr:

for (preferencia in preferenciasConRestaurante) {
    for (idRestaurante in preferencia.idsRestaurantes) {
        // Un método que intenté usar
        preferenciasConRestaurante.removeIf {!listaDeIds.contains(idRestaurante) }

    /* alternativa que intenté usar
    if (!listaDeIds.contains(idRestaurante)) {
        preferenciasConRestaurante.remove(preferencia)
    }
    */

}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para evitar la excepción de modificación concurrente, puedes usar un iterador para recorrer la lista de objetos en lugar de un bucle for. Aquí tienes un ejemplo de fragmento de código:

    val iterator = preferencesWithRestaurant.iterator()
    while (iterator.hasNext()) {
        val preference = iterator.next()
        val restaurantIDs = preference.restaurantIDs
        val hasIntersection = restaurantIDs.intersect(listOfIds).isNotEmpty()
        if (!hasIntersection) {
            iterator.remove()
        }
    }
    

    En este ejemplo, creamos un iterador basado en la lista de objetos y luego recorremos cada objeto usando while (iterator.hasNext()). Luego accedemos a las propiedades individuales del objeto (preference.restaurantIDs) y usamos el método intersect para verificar si hay elementos en la lista que no están en listOfIds. Si no hay tales elementos (hasIntersection es falso), eliminamos el objeto de la lista usando iterator.remove(). Esto debería evitar la excepción de modificación concurrente.

Comments are closed.