2010-05-17 12 views

Odpowiedz

8

Ten kod złamie się z większością kolekcji - innych niż kilka kolekcji, takich jak te w java.util.concurrent, modyfikowanie kolekcji podczas jej iterowania nie jest obsługiwane.

Kilka opcji:

  • uzyskać i wykorzystać iterator jawnie (wezwanie iterator() w kolekcji) zamiast wzmocniony pętli i wywołać iterator.remove() aby usunąć element
  • Należy użyć zwykłej pętli for przesuwając do przodu i cofając się po usunięciu lub przesuwając do tyłu od końca
  • Utrzymanie osobną listę elementów do usunięcia, a następnie usunąć je po iteracji
+1

Jest to chyba warto wspomnieć, że to „funkcja” nazywa fail-szybko. Powinien pomóc nawigować podczas czytania odpowiednich Javadocs. – mindas

0

Zdecydowanie nie należy modyfikować kolekcji podczas jej iteracji. Nie jestem pewien, czy Java na to pozwala; może rzucić wyjątek. Wiem, C# ma ...

0

Iterator nie powiedzie się z ConcurrentModificationException. Tak zaprojektowano strukturę kolekcji.

1
List<Integer> al = new ArrayList<Integer>(); 
for(int i=0;i<10;i++){ 
    al.add(i); 
} 
for(Integer x:al){ 
    al.remove(x); 
    System.out.println(al); 
} 

Cóż, pytanie jest interesujące, więc spróbowałem go w moim systemie i to jest wat.

Exception in thread "main" java.util.ConcurrentModificationException 
    at java.util.AbstractList$Itr.checkForComodification(Unknown Source) 
    at java.util.AbstractList$Itr.next(Unknown Source) 
    at test.Main.main(Main.java:17) 
3

Spójrz na odcinku na iteratory na collection interface tutorial

Korzystanie Iterator zamiast do-każdego konstruktu gdy trzeba usunąć bieżącego elementu. Konstrukcja dla każdego ukrywa iterator, więc nie można wywołać remove. W związku z tym konstruktu dla każdego nie można użyć do filtrowania.

Zauważ, że Iterator.remove to jedyny bezpieczny sposób modyfikowania kolekcji podczas iteracji

Powiązane problemy