2010-07-26 40 views
7
final Set<Expression> exps = meng.getExps(); 
Iterator<Expression> iterator = exps.iterator(); 
final Expression displayedExp = exps.iterator().next(); 
exps.remove(displayedExp); 

Mã này sẽ trả lại ngoại lệ thời gian chạy sau theo dõi:Làm cách nào để xóa một mục khỏi Tập hợp?

null 
java.lang.UnsupportedOperationException 
     at java.util.Collections$UnmodifiableCollection.remove(Collections.java:1021) 

Các Set thi hành meng.getExps() là một LinkedHashSet.

Trả lời

7

Rất tiếc, bạn đã hết may mắn: Bộ được gói bằng Collections.unmodifiableCollection, thực hiện chính xác việc này: làm cho bộ sưu tập không thể sửa đổi được. Điều duy nhất bạn có thể làm là sao chép nội dung vào một Bộ khác và làm việc với điều này.

+0

và có tiện ích nào như Collection.copy để làm điều đó không? – simpatico

+1

Ví dụ: Đặt set = new HashSet (hết hạn); – Landei

+0

@Landei là hành vi java mặc định hoặc chúng ta phải bao bọc nó một cách rõ ràng với Collections.unmodifiableCollection. Nếu nó là theo mặc định, bạn có biết trong đó phiên bản của java là thay đổi này được thêm vào? – Atri

4

Bộ thu gọn của bạn sẽ trả lại bạn một cách rõ ràng UnmodifiableCollection, là một trình bao bọc các loại xung quanh Set s để tránh sửa đổi.

Nói cách khác, API cho bạn biết "đây là bộ sưu tập của tôi, hãy nhìn nhưng đừng chạm vào!"

Nếu bạn muốn sửa đổi nó, bạn nên sao chép nó vào một Tập mới. Có các nhà xây dựng sao chép cho HashSet rất tuyệt vời cho mục đích này.

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