Bạn phải sử dụng một Iterator
để lặp và remove
chức năng của iterator (không danh sách):
Iterator<Pulse> iter = pulseArray.iterator();
while (iter.hasNext()) {
Pulse p = iter.next();
if (p.getCurrent()==null) iter.remove();
}
Lưu ý rằng chức năng Iterator#remove được cho là optionnal nhưng nó được thực hiện bởi Trình lặp của ArrayList.
Dưới đây là đoạn code của chức năng cụ thể này từ 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 }
Dòng expectedModCount = modCount;
là lý do tại sao nó sẽ không ném một ngoại lệ khi bạn sử dụng nó trong khi iterating.
Nguồn
2012-11-09 21:57:49
Không chỉ này sẽ thất bại để làm việc, nhưng ngay cả khi nó đã làm việc nó sẽ có hiệu suất khủng khiếp. Đó là một thuật toán O (n^2) bởi vì bạn phải kiểm tra mọi phần tử của mảng lên đến phần tử bạn đang xóa. Thuật toán tối ưu là O (n). –
@MarkByers "kiểm tra mọi phần tử của mảng" là O (n), tại sao bạn nghĩ đây là O (n^2)? – jlordo
@jlordo: 'list.remove (đối tượng)' là một hoạt động O (n). Nó được thực hiện O (n) lần vì nó trong một vòng lặp. Điều đó cho O (n * n). –