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
}
}
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.
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);
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();
}
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
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--;
}
}
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ź.
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