2008-10-02 26 views
59

Có chức năng tích hợp nào cho các hoạt động thiết lập cổ điển trên lớp java.util.Collection không? Triển khai cụ thể của tôi sẽ là cho ArrayList, nhưng điều này nghe có vẻ giống như một cái gì đó sẽ áp dụng cho tất cả các lớp con của Bộ sưu tập. Tôi đang tìm một cái gì đó như:Các hoạt động thiết lập cổ điển cho java.util.Collection

ArrayList<Integer> setA ... 
ArrayList<Integer> setB ... 
ArrayList<Integer> setAintersectionB = setA.intersection(setB); 
ArrayList<Integer> setAminusB = setA.subtract(setB); 

Sau khi tìm kiếm, tôi chỉ có thể tìm thấy các giải pháp tự trồng. Ngoài ra, tôi nhận ra tôi có thể nhầm lẫn ý tưởng của một "Set" với ý tưởng của một "Bộ sưu tập", không cho phép và cho phép các bản sao tương ứng. Có lẽ đây thực sự chỉ là chức năng cho giao diện Set?

Trong trường hợp không ai biết về bất kỳ chức năng tích hợp nào, có lẽ chúng ta có thể sử dụng nó làm kho lưu trữ cho mã hoạt động thiết lập Java tiêu chuẩn? Tôi tưởng tượng bánh xe này đã được tái tạo nhiều lần.

Trả lời

101

Giao lộ được thực hiện với Collection.retainAll; phép trừ với Collection.removeAll; công đoàn với Collection.addAll. Trong mỗi trường hợp, như Set sẽ hoạt động như một bộ và List sẽ hoạt động như một danh sách.

Là đối tượng có thể thay đổi, chúng hoạt động tại chỗ. Bạn sẽ cần phải sao chép rõ ràng nếu bạn muốn giữ nguyên đối tượng có thể thay đổi ban đầu chưa được sửa đổi.

7

Bạn đang tìm kiếm giao diện java.util.Set (và triển khai HashSet và TreeSet (được sắp xếp)) chưa?
Giao diện định nghĩa removeAll (Collection c) trông giống như substract() và retainAll (Collection c) trông giống như giao lộ.

+0

liên kết tốt hơn (Java 6 tài liệu): http: //java.sun. com/javase/6/docs/api/java/util/Set.html –

+2

Câu trả lời hay. Tuy nhiên, chúng sẽ sửa đổi một trong hai bộ. Nếu Ross muốn một tập thứ ba chứa giải pháp, anh ta sẽ cần sao chép một đầu tiên và sử dụng nó làm biến ngầm. –

+0

mmyer, cảm ơn vì đã chỉ ra rằng, tôi vẫn có một tab được mở trên tài liệu Java 1.5 để chơi với chế biến, và tôi thường xuyên bị cắn bởi những bộ khung darn này. Liên kết đã được sửa. – PhiLho

15

Tôi muốn giới thiệu Google Guava. Lớp học Sets dường như có chính xác những gì bạn đang tìm kiếm. Nó có phương thức intersection và phương thức difference.

This presentation có lẽ là điều bạn muốn xem nếu bạn quan tâm. Nó đề cập đến Google Bộ sưu tập, đó là tên gốc của Guava.

5

Đối với các hoạt động có thể thay đổi, hãy xem câu trả lời được chấp nhận.

Đối với một biến thể imutable bạn có thể làm điều này với java 8

trừ

set1 
    .stream() 
    .filter(item-> !set2.contains(item)) 
    .collect(Collectors.toSet()) 

ngã tư

set1 
    .stream() 
    .filter(item-> set2.contains(item)) 
    .collect(Collectors.toSet()) 
Các vấn đề liên quan