entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Eliminar objeto de un ArrayList a la vez que se recorre el ArrayList

Hola.

El problema es bastante básico pero parece que me he atascado.

Estoy recorriendo un ArrayList lleno de Objetos. Si el objeto cumple una propiedad concreta elimino el objeto de ArrayList. Pero en ese momento, el tamaño del ArrayList a cambiado y no termino de recorrer todo el ArrayList.

Que solución me proponéis?

            for(int i=0; i<instalaciones.size();i++ ){
                Instalacion instalacion = instalaciones.get(i);
                if(instalacion.cumpleDistancia(this.loc, distancia)){
                nombre = instalacion.getNombre();
                idInstalacion = instalacion.getIdInstalacion();

                }
                else{
                    instalaciones.remove(i);

                }
        }

saludos y gracias.

3 Respuestas

2votos

kaiba78987 Puntos2300

Hola.

Yo creo que lo más fácil que puedes hacer es recorrer la lista con un iterador. Tiene la ventaja de que ya tiene el método remove especificado en la interfaz.

http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html

Básicamente, un iterador es un objeto que señala a uno de los elementos de la colección. Te proporciona métodos para ver si hay un elemento siguiente y para saltar a dicho elemento siguiente, así como para eliminarlo.

También es más eficiente que las otras soluciones propuestas, ya que el iterador marca la posición a borrar y el programa no necesita volver a buscar dentro de la colección para comparar objetos.

egoitz_gonzalez comentado Mar 14, 2014

Gracias.

Dejo la respuesta.

for(Iterator<Instalacion> iter = instalaciones.iterator(); iter.hasNext();){
                                     Instalacion instalacion = iter.next();
                 if(instalacion.cumpleDistancia(this.loc, distancia)){
                    nombre = instalacion.getNombre();
                    idInstalacion = instalacion.getIdInstalacion();

                }
                else{
                    iter.remove();
                }
                }

kaiba78987 comentado Mar 14, 2014

sólo sustituiría el bucle for por un bucle while. probablemente, funcione igual, pero creo que es importante guardar la semántica. El bucle for está pensado para cuando sabes cuántas veces vas a tener que hacer algo, que no es el caso. Aunque muchos lenguajes permiten este otro uso, creo que queda más claro si se usa un while.

Iterator<Instalacion> iter = instalaciones.iterator();
while (iter.hasNext()) {
...
}

Un saludo y me alegra haber podido ayudarte :)

egoitz_gonzalez comentado Mar 14, 2014

Perfecto. Buena anotación.

Gracias.

1voto

jdbenitez Puntos820

Guardar los índices que quieres borrar, después due recorriste todo, eliminar la posición n - (veces que haz borrado). Por ejemplo, si quieres borrar las posiciones 1, 4 y 8, debes recorrer el array para borrar las posiciones 1, 3, y 6 (posiciones actualizadas).

La otra es que guardes en un array diferente los que no se vayan a borrar, una vez que termines la validación, borras el array original completo, y renombras el array creado en la función.

O puedes usar un bucle while.

Quizá eso sirva.

4votos

aalzatea Puntos220

La mejor manera de hacer esto sin tener inconvenientes al borrar es la siguiente:

for(Instalacion instalacion : instalaciones){
    if(instalacion.cumpleDistancia(this.loc, distancia)){
         nombre = instalacion.getNombre();
         idInstalacion = instalacion.getIdInstalacion();
     } else {
         instalaciones.remove(instalacion);
     }
}

Así te evitas el manejo de los indices. Esta es una buena práctica desde java 1.5

Leonardo-Tadei comentado Mar 10, 2014

Totalmente de acuerdo.
Esto se puede hacer en todas las versiones de Java en que array es iterable.

egoitz_gonzalez comentado Mar 10, 2014

Gracias por las respuestas.

Recibo el siguiente error en la linea instalaciones.remove(instalacion)

03-11 01:04:10.269: E/AndroidRuntime(2090): java.lang.Error: null

El objeto existe. No sé porque ese error.

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Otras Preguntas y Respuestas


Actividad Reciente

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta