Musisz użyć Iterator
iteracyjne i funkcja remove
z iteracyjnej (nie listy):
Iterator<Pulse> iter = pulseArray.iterator();
while (iter.hasNext()) {
Pulse p = iter.next();
if (p.getCurrent()==null) iter.remove();
}
pamiętać, że funkcja Iterator#remove mówi się optionnal ale jest realizowane przez Iterator ArrayList.
Oto kod tej konkretnej funkcji z ArrayList.java:
765 public void remove() {
766 if (lastRet < 0)
767 throw new IllegalStateException();
768 checkForComodification();
769
770 try {
771 ArrayList.this.remove(lastRet);
772 cursor = lastRet;
773 lastRet = -1;
774 expectedModCount = modCount;
775 } catch (IndexOutOfBoundsException ex) {
776 throw new ConcurrentModificationException();
777 }
778 }
779
780 final void checkForComodification() {
781 if (modCount != expectedModCount)
782 throw new ConcurrentModificationException();
783 }
784 }
Linia expectedModCount = modCount;
dlatego nie rzuci wyjątek, gdy go używać podczas iteracji.
Nie tylko to nie działa, ale nawet gdyby tak się stało praca miałoby to fatalne wyniki. Jest to algorytm O (n^2), ponieważ musisz sprawdzić każdy element tablicy do tego, który usuwasz. Optymalnym algorytmem jest O (n). –
@MarkByers "sprawdź każdy element tablicy" to O (n), dlaczego myślisz, że to O (n^2)? – jlordo
@jlordo: 'list.remove (object)' jest operacją O (n). Wykonuje się O (n) razy, ponieważ jest w pętli. To daje O (n * n). –