2008-12-26 35 views
19

Đó là, nếu tôi có hai hoặc nhiều bộ, và tôi muốn trả về một tập mới có chứa một trong hai:Java: Có cách nào dễ dàng, nhanh chóng với AND, OR hoặc XOR cùng nhau không?

  1. Tất cả các yếu tố mỗi bộ có điểm chung (AND).
  2. Tất cả các thành phần của mỗi bộ (OR).
  3. Tất cả các yếu tố duy nhất cho mỗi bộ. (XOR).

Có cách nào dễ dàng, sẵn có để thực hiện điều đó không?

Chỉnh sửa: Đó là thuật ngữ sai, phải không?

+4

Thuật ngữ chính xác với các bộ là công đoàn (hoặc), giao nhau (và), sự khác biệt đối xứng (xor). – Brian

+0

Cảm ơn. Đã cố nhớ lại điều đó. –

Trả lời

32

Giả sử 2 Set đối tượng a và b

AND (giao điểm của hai bộ)

a.retainAll(b); 

OR (công đoàn của hai bộ)

a.addAll(b); 

XOR hoặc cuộn vòng lặp của riêng bạn:

foreach item 
if(a.contains(item) and !b.contains(item) || (!a.contains(item) and b.contains(item))) 
c.add(item) 

hoặc làm điều này:

c.addAll(a); 
c.addAll(b); 
a.retainAll(b); //a now has the intersection of a and b 
c.removeAll(a); 

Xem Set documentationpage này. Để biết thêm.

+0

Thảo luận hướng dẫn về các bộ tại http://java.sun.com/docs/books/tutorial/collections/interfaces/set.html cũng có thể là nền tảng hữu ích. –

1

kiểm tra các bộ api. nếu bạn sử dụng addAll, bạn có thể nhận hoặc. Nếu bạn sử dụng retainAll bạn có thể nhận được và. Tôi không biết về Xor.

Chỉnh sửa: từ tài liệu đã đặt.

... Nếu bộ sưu tập được chỉ định cũng là một bộ, thao tác addAll thay đổi hiệu quả tập hợp này sao cho giá trị của nó là kết hợp của hai bộ.

.... Nếu bộ sưu tập được chỉ định cũng là một bộ, thao tác này sẽ sửa đổi hiệu quả tập hợp này sao cho giá trị của nó là giao điểm của hai bộ.

+0

Sẽ không [xor] là sự kết hợp của [tập hợp bắt đầu - hoặc]? – Esko

3

@Milhous nói:

kiểm tra ra các bộ api. nếu bạn sử dụng addTất cả các bạn có thể nhận hoặc. Nếu bạn sử dụng giữ lạiTất cả bạn có thể nhận được và. Tôi không biết về Xor.

Nó có vẻ như nếu bạn có bộ s1s2 bạn có thể làm điều này để có được XOR:

  1. sao chép tập s1 để s3
  2. s1.removeAll(s2); (S1 bây giờ chứa tất cả các yếu tố không s2)
  3. s2.removeAll(s3); (s2 hiện chứa tất cả các phần tử không có trong s3 = cũ s1)
  4. s1.addAll(s2); (S1 bây giờ chứa sự kết hợp của hai bộ trên)
0

Tôi chắc chắn rằng Jakarta Common Collections API hỗ trợ các công đoàn, giao lộ, v.v.

Tôi sẽ ngạc nhiên nếu API thu thập của Google không tốt.

+0

Đáng buồn thay, Bộ sưu tập Commons Lib không cung cấp Generics. –

8

Bạn có thể sử dụng Google-Collections Sets class có phương thức giao nhau() union() và symmetricDifference().

Sets.intersection(set1, set2); 
Sets.union(set1, set2); 

SetView view = Sets.intersection(Sets.union(set1, set2), set3); 
Set result = view.copyInto(new HashSet()); 
+1

Nó nên nhấn mạnh rằng các quan điểm (được cung cấp bởi các bộ sưu tập google) là một cách tiếp cận hiệu quả hơn nhiều để thực hiện các hoạt động thiết lập khi bạn có tập hợp lớn. Điều này đặc biệt đúng nếu bạn không cần phải lặp qua tất cả các phần tử trong kết quả; bạn đang sử dụng nó như một cấu trúc logic ở giữa một thuật toán phức tạp hơn. Hãy xem http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Sets.html#union%28java.util.Set,%20java.util.Set%29 ví dụ. –

+1

Ngoài ra, Set.symmetricDifference() có sẵn để nhận các phần tử duy nhất. – Muhd

+0

@DilumRanatunga liên kết đã chết – Devenv

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