2012-03-13 24 views
21

Me gustaría eliminar un objeto de un ArrayList cuando haya terminado con él, pero no puedo encontrar la forma de hacerlo. Tratar de eliminarlo como en el código de ejemplo a continuación no quiere funcionar. ¿Cómo podría acceder al iterador del objeto actual px en este ciclo para eliminarlo?Eliminar objeto de ArrayList en cada ciclo

for(Pixel px : pixel){ 
[...] 
    if(px.y > gHeigh){ 
    pixel.remove(pixel.indexOf(px)); // here is the thing 
    pixel.remove(px); //doesn't work either 
    } 
} 
+1

posible duplicado de [Llamando a eliminar en bucle foreach en Java] (http://stackoverflow.com/questions/1196586/calling-remove-in -foreach-loop-in-java) – DNA

+0

posible duplicado de [iteración a través de una colección, evitando ConcurrentModificationException al eliminar en bucle] (http://stackoverflow.com/questions/223918/iterating-through-a-collection-avoiding-concurrentmodificationexception -cuando-re) – omerhakanbilici

Respuesta

62

No se puede, dentro del bucle for mejorado. Usted tiene que utilizar el enfoque "de largo a mano":

for (Iterator<Pixel> iterator = pixels.iterator(); iterator.hasNext();) { 
    Pixel px = iterator.next(); 
    if(px.y > gHeigh){ 
    iterator.remove(); 
    } 
} 

Por supuesto, no todos los iteradores de apoyo eliminación, sino que debe estar bien con ArrayList.

Una alternativa es crear una colección adicional de "píxeles para eliminar" y luego llamar al removeAll en la lista al final.

1

uso de un bucle de for regular, el bucle mejorado for mantiene un iterador, y no permite la eliminación de objetos o bien utiliza el iterador explícitamente

Editar: véase la respuesta de la pregunta esta Calling remove in foreach loop in Java

2

es necesario crear y tener acceso al repetidor explícitamente

Iterator<Pixel> it = pixel.iterator(); 
while(it.hasNext()){ 
Pixel.px = it.next(); 
//... 
it.remove(); 
} 
1

no puede modificar una colección mientras alguien está interactuando sobre ella, incluso si ese alguien que lo eran. El uso normal de ciclo:

for(int i = 0; i < pixel.size(); i++){ 
    if(pixel.get(i).y > gHeigh){ 
     pixel.remove(i); 
     i--; 
    } 
} 
+0

tiene el problema del siguiente ciclo que necesita estar en el índice 'i' de nuevo y necesita asegurarse de que no se incrementa –

+0

Buena captura , ¡gracias! –

0

Si Pixel es su propio objeto distinto entonces necesidad de aplicar el método equals y hashCode para sus objetos de píxeles. El método indexOf también encuentra el índice usando el método equals. Intenta implementar eso y compruébalo.

23

Usando y lamdba expressions, se ha introducido el método removeIf para colecciones.

Elimina todos los elementos de esta colección que satisfacen el predicado dado .

Así sólo tendrá una línea:

pixels.removeIf(px -> px.y > gHeigh); 
+0

por cierto 'removeIf' usa' Iterator' y 'while' loop. Puedes verlo en java 8 'java.util.Collection.java' – omerhakanbilici

+1

@omerhakanbilici Esta es solo la implementación predeterminada. Puede ver que ha sido optimizado para 'ArrayList's, por ejemplo. –

Cuestiones relacionadas