2012-05-10 39 views
7

Tôi muốn kiểm tra như thế nào để có được giao nhau giữa hai danh sách, đây là mã của tôi:Danh sách retainAll ngoại lệ

  List<Integer> list = Arrays.asList(16, 17, 18, 19, 20); 
     List<Integer> list2 = list.subList(2, 5); 

     System.out.println(list.subList(2, 5)); 
     System.out.println(list.containsAll(list.subList(2, 5))); 
     System.out.println(list.retainAll(list2)); 

này tạo ra:

Exception in thread "main" java.lang.UnsupportedOperationException 
    at java.util.AbstractList.remove(Unknown Source) 
    at java.util.AbstractList$Itr.remove(Unknown Source) 
    at java.util.AbstractCollection.retainAll(Unknown Source) 
    at gov.noaa.nhc.App.main(App.java:48) 

Nhưng tôi không làm bất kỳ để loại bỏ việc. Tại sao ngoại lệ sản xuất này?

Cập nhật I:

Sử dụng:

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20)); 
List<Integer> list2 = list.subList(2, 5); 

Tạo:

java.util.ConcurrentModificationException 

Kể từ List2 được hỗ trợ bởi list1, loại bỏ các mục từ list1 sẽ gây ra ngoại lệ này. Phiên bản cuối cùng làm việc:

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20)); 
List<Integer> list2 = Arrays.asList(18, 19, 20); 

hoặc

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20)); 
List<Integer> list2 = new ArrayList<Integer>(Arrays.asList(18, 19, 20)); 

hoặc

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20)); 
List<Integer> list2 = new ArrayList<Integer>(list.subList(2, 5)); 

Cám ơn câu trả lời tất cả mọi người của bạn.

Trả lời

16

Khi bạn sử dụng Arrays.asList, bạn sẽ nhận được danh sách được hỗ trợ bởi mảng thực tế được chuyển với chức năng bị hạn chế. Nếu bạn muốn một danh sách hoàn toàn có thể sửa đổi, bạn phải tạo một danh sách mới. Ví dụ:

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20)); 
List<Integer> list2 = new ArrayList<Integer>(list.subList(2, 5)); 
list.retainAll(list2); 
System.out.println(list); 
// result: [18, 19, 20] 
+0

'UnsupportedOperationException' - nếu thao tác' retainAll' không được bộ sưu tập này hỗ trợ. – user845279

+0

Sử dụng ví dụ của bạn Tôi nhận được Ngoại lệ trong chuỗi "chính" java.util.ConcurrentModificationException –

+0

Đó là vì bạn đã sử dụng hàm 'subList()'. 'list2' được hỗ trợ bởi' list'. Hàm 'retainAll' sử dụng một trình lặp để xóa các giá trị không giao nhau - điều này gây ra' ConcurrentModificationException'. Bạn có thể đọc về 'Iterator' và sửa đổi đồng thời trên Javadocs. – user845279

0

lưu giữTất cả sẽ xóa tất cả các phần tử không có trong danh sách đã cho.

3

Khi documentation nói, List.retainAll() phương pháp

chỉ giữ lại các yếu tố trong danh sách này được chứa trong bộ sưu tập xác định (hoạt động không bắt buộc). Nói cách khác, xóa khỏi danh sách này tất cả các phần tử không có trong bộ sưu tập được chỉ định. [nhấn mạnh mỏ]

0

Tài liệu cũng cho biết rằng lưu giữTất cả ném không được hỗ trợOperationException khi Danh sách triển khai không hỗ trợ phương pháp này.

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