2011-11-07 12 views
9

Jak mogę dodać elementy z dwóch zestawów?Dodawanie elementów z dwóch zestawów

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

Jak elementy z tych dwóch razem?

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

Oto, co starałem:

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; 

I to nie działa, ponieważ metoda dodatek działa tylko dla jednej liczby całkowitej, a nie zbiór liczb całkowitych. Czy istnieje metoda, w której mogę dodać dwa zestawy razem?

Muszę też zwrócić zestaw. Jak mogę to zrobić?

+2

spróbuj użyć addAll zamiast dodawać –

Odpowiedz

29

Zastosowanie Set.addAll()

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

Ponadto, należy wpisać swoje konstruktorów (jak wyżej).

Aby uczynić to w sposób, spróbuj tego:

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

W rzeczywistości, chodźmy całkowicie orzechy ... tutaj jest to metoda, która odbędzie dowolną liczbę zbiorów dowolnego typu, która rozciąga się żądany typ, i łączy je w jeden zestaw:

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

Nie chcesz zestawu. Jak już odkryłeś, z definicji nie mają duplikatów. Szukasz Multiset (w rzeczywistości, SortedMultiset według wyglądu), znany również jako Torba. Java nie ma jednej wersji po wyjęciu z pudełka, ale są dostępne implementacje open source, na przykład Google's.

EDYCJA: Również chcesz zrobić setOne.addAll(setTwo), nie jeden element na raz, tak jak powyżej, ale jest to problem dodatkowy.

+0

również, faktycznie chcę później usunąć duplikaty. –

+0

Ummm, to zdecydowanie nie jest to, o co prosiłeś pierwotnie, ponieważ twoje dane wyjściowe mają duplikaty. –

+0

Jaka jest różnica między * bag * i * list *? – Gabe

0

Lub alternatywnie wykorzystać posortowaną ArrayList:

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

To nie wyeliminuje duplikatów. – rakeeee

0

Jako czeski mentioned, najlepszą odpowiedzią jest użycie Set.addAll(). Pamiętaj, że jeśli nie masz nic przeciwko nadpisywaniu jednego ze swoich zestawów, jest bardziej efektywny (przynajmniej z punktu widzenia czasu programisty: P), aby dodać jeden zestaw bezpośrednio do innego zestawu:

one.addAll(two);