Usuwanie obiektu z ArrayList dla każdej pętli

Chciałbym usunąć obiekt z ArrayList Kiedy z nim skończę, ale nie mogę znaleźć sposobu, aby to zrobić. Próba usunięcia go jak w przykładowym kodzie poniżej nie chce działać. Jak Mogę dostać się do iteratora bieżącego obiektu px w tej pętli, aby go usunąć?

for( Pixel px : pixel){ 
[...]
  if(px.y > gHeigh){
     pixel.remove(pixel.indexOf(px)); // here is the thing
     pixel.remove(px); //doesn't work either
  }
}
Author: Null, 2012-03-14

6 answers

Nie możesz, wewnątrz rozszerzonej pętli for. Musisz użyć podejścia "long-hand":

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

Oczywiście, nie wszystkie Iteratory wspierają usuwanie, ale powinno Ci wystarczyć ArrayList.

Alternatywą jest zbudowanie dodatkowej kolekcji "pikseli do usunięcia", a następnie wywołanie removeAll na liście na końcu.

 63
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-13 20:13:54

Używając java-8 i wyrażeń lamdba , metoda removeIf został wprowadzony do kolekcji.

Usuwa wszystkie elementy tego zbioru, które spełniają podane predykat.

Więc zajmie to tylko jedną linijkę:

pixels.removeIf(px -> px.y > gHeigh);
 23
Author: Alexis C.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-08 10:10:47

Musisz utworzyć i uzyskać dostęp do iteratora jawnie

Iterator<Pixel> it = pixel.iterator();
while(it.hasNext()){
Pixel.px = it.next();
//...
it.remove();
}
 2
Author: ratchet freak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-30 23:17:18

Pętla enhanced for utrzymuje iterator i nie pozwala na usuwanie obiektów, lub używa iteratora jawnie

Edit: zobacz odpowiedź na to pytanie wywołanie remove W pętli foreach w Javie

 1
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:24

Nie można modyfikować kolekcji, gdy ktoś nad nią iteruje, nawet jeśli tym kimś byłeś Ty. Użyj normalnego dla cyklu:

for(int i = 0; i < pixel.size(); i++){
    if(pixel.get(i).y > gHeigh){
        pixel.remove(i);
        i--;
    }
}
 1
Author: Jakub Zaverka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-13 21:49:23

Jeśli piksel jest twoim własnym, niestandardowym obiektem, musisz zaimplementować metodę equals i hashcode dla Twojego obiektu pikselowego. Metoda indexOf znajduje również indeks przy pomocy metody equals. Spróbuj to zaimplementować i sprawdź.

 0
Author: raddykrish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-13 20:17:29