Kasowanie elementów ArrayList w pętli for each

0

Cześć, Mam taką zagwozdkę. Dostałem klasę testową do której muszę ułożyć program, dodać klasy, metody itp.
Mam tam taki fragment:

for (Items a : pudło.getItems()) item.remove(a);

metoda getItems() jedyne co robi to zwraca listę ArrayList.
metoda remove(a) daje lista.remove(a);

I problem w tym, że jak w pętli skasuje się 1. item z listy to następujące po nim przesuwają się o jedną pozycję do przodu, przez co pętla for each pomija niektóre elementy i ich nie kasuje.

Problem udałoby się rozwiązać gdyby itemy były usuwane z listy od końca, a nie od początku, tylko jak to zrobić ?

P.S nie mogę zmienić klasy testowej :/ ?

0
list.remove(list.size()-1); // usuwa ostatni element

ale możesz po prostu

list.clear();
2

Primo, list.clear() załatwia sprawę jak zauważył dam1an.
Secundo, foreach nie jest dobrym rozwiązaniem jeśli chcesz usuwać elementy z iterowanej kolekcji. Prawdopodobnie przy takim użyciu jak ty robisz dostaniesz ConcurrentModificationException. Żeby usuwanie przy iterowaniu miało ręce i nogi musiałbyś używać iteratora bezpośrednio, a nie poprzez foreach. Dodatkowo ArrayList zwraca ListIterator, który może poruszać się do tyłu. Wystarczy jak odpalisz metodę list.listInterator(list.size()) i dostajesz iterator ustawiony na końcu listy i możesz poruszać się do tyłu.

0

Ja wiem, że pętla for each nie jest najlepszym rozwiązaniem dla ArrayList ale taką dostałem klasę testową i muszę zrobić program dokładnie pod nią. Mój nauczyciel pewnie zakładał inne zastosowanie dla programu niż ArrayList dla którego for each było by lepsze np: tablice. W każdym razie 1. rozwiązanie Dam1an załatwia sprawę. lista.clear() jest lekko bez sensu jeśli już musi być ta pętla for each :P

Dzięki za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1