2010-09-28 29 views
8

Tôi muốn lặp qua Tập hợp và xóa các phần tử khỏi tập hợp phù hợp với một số điều kiện. documentation of iterator không nói gì về việc sửa đổi danh sách trong khi lặp lại nó.Java Đặt trình vòng lặp, an toàn để xóa các phần tử?

Điều này có khả thi không? Nếu không, cách tốt nhất để làm điều đó là gì? Lưu ý rằng tôi chỉ muốn xóa các phần tử khỏi tập hợp được cung cấp bởi Iterator.

Chỉnh sửa: Nhanh chóng được chứng minh rằng điều này là có thể. Tôi có thể làm điều đó với cú pháp sau đây không?

for(Node n : mySet) { 
    mySet.remove(n); 
} 
+0

"Tôi có thể làm điều đó với cú pháp sau không?". Số – Thilo

Trả lời

16

Có, bạn có thể sử dụng lặp để loại bỏ các yếu tố hiện một cách an toàn:

iterator.remove(); 

Các javadoc của remove() nói:

Loại bỏ các yếu tố quy định từ bộ này nếu nó là hiện tại (hoạt động tùy chọn). Chính thức hơn, loại bỏ một phần tử e sao cho (o == null? E == null: o.equals (e)), nếu tập hợp này chứa một phần tử như vậy. Trả về true nếu tập hợp này chứa phần tử (hoặc tương đương, nếu tập hợp này thay đổi do kết quả của cuộc gọi). (Thiết lập này sẽ không chứa các yếu tố một lần trở về cuộc gọi.)


trả lời cho câu hỏi tiếp theo của bạn: Không, bạn không thể. Sửa đổi một tập hợp trong khi lặp lại nó với vòng lặp tăng cường sẽ gây ra một ConcurrentModificationException.

+1

Và đây là cách duy nhất bạn có thể sửa đổi bộ sưu tập trong khi lặp lại. Bất cứ điều gì khác sẽ cung cấp cho bạn một ConcurrentModificationException. – Thilo

+0

Cảm ơn !!!!!!!!! –

1

Câu trả lời của tangens là chính xác. Nếu bạn không sử dụng iterator.remove() nhưng loại bỏ trực tiếp từ Set, bạn sẽ nhận được một cuộc gọi ngoại lệ ConcurrentModificationException

-1

cho (Node n: mySet) { mySet.remove (n); }

sẽ không hoạt động vì bạn đang sửa đổi tập hợp bạn đang lặp lại. Tuy nhiên điều này chỉ có thể được thực hiện bằng cách sử dụng trình lặp mà không phải là trường hợp theo cách này.

Đây là một bất lợi khi sử dụng tăng cường cho vòng lặp.

0

này đã thực sự được cải thiện trong Java 8. Bây giờ bạn có thể chỉ

mySet.removeIf(element -> someConditionMatches());

Trên đây được thực hiện như một phương pháp default trong java.util.Collection và cần lưu tất cả mọi người từ viết vòng lặp nhàm chán. Điều đó nói rằng, nó sẽ làm việc cho bất kỳ loại bộ sưu tập, và không chỉ Set.

Các vấn đề liên quan