2008-12-26 44 views
19

也就是說,如果我有兩套或多套,我想返回包含任何新集:Java:有沒有一種方便,快捷的方式來將AND,OR或XOR集在一起?

  1. 所有各組有共同(AND)的元素。
  2. 每個集合(OR)的所有元素總數。
  3. 所有元素都是唯一的元素。 (XOR)。

有沒有一種簡單的方法可以做到這一點?

編輯:這是錯誤的術語,不是嗎?

+4

具有集合的正確術語是聯合(或),交集(和),對稱差異(異或)。 – Brian 2008-12-26 16:58:01

+0

謝謝。正試圖回想起這一點。 – 2008-12-26 17:04:33

回答

32

假設2組對象a和b

AND(兩組交點)

a.retainAll(b); 

OR的兩組(聯合)

a.addAll(b); 

XOR 要麼推出自己的循環:

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

或做到這一點:

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

Set documentationpage。更多。

+0

http://java.sun.com/docs/books/tutorial/collections/interfaces/set.html上關於集合的教程討論可能也是有幫助的背景。 – 2008-12-26 18:11:03

1

檢出集api。如果你使用addAll你可以得到或。如果你使用retainAll你可以得到和。我不知道Xor。

編輯:從設置文件。

...如果指定的集合也是一個集合,那麼addAll操作會有效地修改此集合,使其值爲兩個集合的並集。

....如果指定的集合也是一個集合,則此操作將有效地修改此集合,使其值爲兩個集合的交集。

+0

不是[xor]是[起始組合]還是[組合]? – Esko 2008-12-26 16:58:24

3

@Milhous說:

退房套API。如果你使用 addAll你可以得到或。如果你使用 retainAll你可以得到和。我沒有 瞭解XOR。

好像如果你有套s1s2你可以做到這一點得到XOR:

  1. 設定s1複製到s3
  2. s1.removeAll(s2);(現S1包含不在S2的所有元素)
  3. s2.removeAll(s3);(s2現在包含不在s3 =舊s1中的所有元素)
  4. s1.addAll(s2);(現在S1包含上述兩個集合的並集)
0

我敢肯定,雅加達共同集合API支持工會,十字路口等

我會很驚訝,如果谷歌集合API並沒有爲好。

+0

不幸的是,Commons Collections Lib不提供仿製藥。 – 2009-06-16 17:10:55

8

可以使用具有方法intersection()union()和symmetricDifference()的Google-Collections Sets class

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

SetView view = Sets.intersection(Sets.union(set1, set2), set3); 
Set result = view.copyInto(new HashSet()); 
相關問題