2011-11-07 119 views
9

如何添加兩組元素?從兩組添加元素

If there's a set one (1, 3, 6, 8) 
And a set two (2, 4, 6, 8) 

我如何將這兩個元素結合在一起?

Output should be (1, 2, 3, 4, 6, 8) 

這裏是我的嘗試:

Set<Integer> one = new HashSet(); 
one.add(1); 
one.add(3); 
// and so on 
Set<Integer> two = new HashSet(); 
two.add(2); 
two.add(4); 
// and so on 
Set<Integer> newSet = new HashSet(); 
newSet.add(one); 
newSet.add(two); 

return newSet; 

這是不行的,因爲add方法僅適用於一個整數,整數不是一個集合。有沒有一種方法可以將兩組相加?

我也必須返回設置。我怎麼做?

+2

嘗試使用addAll而不是添加 –

回答

29

使用Set.addAll()

Set<Integer> one = new HashSet<Integer>(); 
Set<Integer> two = new HashSet<Integer>(); 
Set<Integer> newSet = new HashSet<Integer>(one); 
newSet.addAll(two); 

此外,你應該輸入你的構造(如上)。

爲了使這變成一種方法,試試這個:

public static Set<Integer> addTwoSets(Set<Integer> one, Set<Integer> two) { 
    Set<Integer> newSet = new HashSet<Integer>(one); 
    newSet.addAll(two); 
    return newSet; 
} 

事實上,讓我們去完全是一派胡言......這裏是一個將採取任何數量的擴展所需類型的任何類型的集合的方法,並且將它們合併成一個組:

public static <T> Set<T> merge(Collection<? extends T>... collections) { 
    Set<T> newSet = new HashSet<T>(); 
    for (Collection<? extends T> collection : collections) 
     newSet.addAll(collection); 
    return newSet; 
} 
2

你不想要一套。正如你發現的那樣,根據定義,它們沒有重複的元素。您正在尋找一個Multiset(實際上,它的外觀SortedMultiset),也被稱爲。 Java沒有一個開箱即用,但有開源的實現可用,例如Google's

編輯:此外,你想要做setOne.addAll(setTwo),而不是一次一個元素,如上面評論,但這是次要問題。

+0

好吧,實際上我想稍後刪除重複項。 –

+0

嗯,這絕對不是你最初問的問題,因爲你的示例輸出有重複。 –

+0

*包*和*列表*有什麼區別? – Gabe

0

或者交替使用排序的ArrayList:

ArrayList<Integer> list = new ArrayList<Integer>(one); 
list.addAll(two); 
Collections.sort(list); 
+0

這不會消除重複。 – rakeeee

0

由於波希米亞人mentioned,最好的答案是使用Set.addAll()。請記住,如果您不介意覆蓋其中一個套件,那麼效率更高(至少從開發人員的時間角度看:P),以便將一組套件直接添加到另一套套件中:

one.addAll(two);