Eliminar de un ArrayList con un for

LLoid

Hola, tengo un problemilla que seguro que tiene fácil solución pero me lleva de cabeza. La cosa es que dentro de un for, tengo qeu ir eliminando elementos de un arrayList, tal que así:

                    for (int i = 0; i < lista.size(); i++) {  //Recorremos toda la lista
                        if (lista.get(i).getPadre().equals(nodoPadre)) {
                            hijos.add(lista.get(i)); 
                            lista.remove(i);  //eliminar
                        }
                    } 

Ahora bien, tengo que elminar TODOS los nodos que cumplan el if, pero siempre se me queda uno porque en la última iteración, al haber eliminado un elemento de la lista, lista.size() devuelve el mismo valor que la variable i y entonces la última iteración no se hace. He probado también a sacar lista.size() a una variable externa del bucle:

int tam = lista.size();
                    for (int i = 0; i < tam; i++) { //
                        if (lista.get(i).getPadre().equals(nodoPadre)) { //Excepción
                            hijos.add(lista.get(i)); //
                            lista.remove(i); //
                        }
                    }   

Pero tengo una excepción IndexOutOfBoundsException en la línea del if (lo cual tiene bastante sentido).

Bueno, pues ese es el problema que tengo, si me podéis echar una mano mil gracias.

elkaoD

#1 usa un while y cuando hagas remove no aumentes el contador.

2 1 respuesta
LOc0

#2, pero aunque por tu pregunta se ve que aún estás empezando, no estaría de más que te sonara esto:

iterador

Salu2 ;)

2 2 respuestas
LLoid

#3 Gracias!

Lecherito

Incluso quizá con un for simplificado, no lo he probado con arraylists, la verdad, pero vamos, seguro que se puede.

for (Object o: lista) {
  if (o.getPadre().equals("qq")) {
    lista.remove(o);
  }
}
1 respuesta
elkaoD

#5 nope, no se puede, te dará un ConcurrentModifcationException o algo del estilo porque estás modificando la lista en mitad de la iteración.

La cuestión de usar el iterador sin foreach (como #3) es que tienes acceso explícito al iterador y por tanto a iterador.remove() (que el foreach no tiene porque el iterador está implícito) el cual sí permite hacer remove en mitad de la iteración.

Y creo que he desgastado la palabra iteración, iteración, iteración, iteración.

2
Foxandxss

Como ya han dicho, no elimines elementos de la lista que estás iterando.

Si el for va desde 0 hasta el tamaño de la lista pero borras cosas a mitad, pues petará.

JuAn4k4

Solucion trapera que se lleva mucho por aqui (españa):

i--; despues de borrar.

1 respuesta
dagavi

#8 En algunas prácticas de la uni tenía eso xD

Pero bueno, no me parece mal.

14 días después
LLoid

Refloto esto con una duda del mismo palo, ¿qué hago si quiero sacar un objeto de un arraylist? no me refiero a obtener la referencia a memoria, si no a copiar el objeto al que apunta un índice del arraylist y asignarlo a otra variable:

ArrayList<cosas> lista = new ArrayList<>();
lista.add(cosa);

Cosa cosaAparte = lista.get(i); // i = indice en el que está cosa

Y que luego cuando modifique cosaAparte sea un objeto diferente del que hay en el arraylist, porque si no lo he entendido mal, tal y como estaría el código, el elemento i de lista y cosaAparte apuntarían al mismo objeto, y si modifico ese objeto el cambio se refleja en las dos variables, ¿cómo hago para que esto no ocurra? ¿O estoy completamente confundido y no tengo ni puta idea? xD

2 respuestas
sasher

#10 Léete esto: http://javadude.com/articles/passbyvalue.htm

Y una vez que te hayas leído eso, mira el método Object.clone()

elkaoD

#10 yo te recomiendo: http://stackoverflow.com/questions/869033/how-do-i-copy-an-object-in-java

Básicamente, crea un copy constructor. OJO, las referencias las tienes que copiar si quieres una copia profunda.

También puedes sobreescribir el método .clone() pero es MUY fácil liarla.

LLoid

Bueno, voy a echarle un ojo a lo que me habéis pasado y ya os comento dudas y tal xD

Gracias!

Usuarios habituales

  • LLoid
  • elkaoD
  • sasher
  • JuAn4k4
  • Foxandxss
  • Lecherito
  • LOc0