2011-11-07 3 views
9

Comment ajouter des éléments à partir de deux ensembles?Ajout d'éléments à partir de deux ensembles

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

Comment puis-je les éléments de ces deux ensemble?

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

Voici ce que j'ai essayé:

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; 

Et cela ne fonctionne pas, comme la méthode d'ajout ne fonctionne que pour un seul entier, et non une collection d'entier. Y at-il une méthode où je peux ajouter deux ensembles ensemble?

Je dois également retourner l'ensemble. Comment je fais ça?

+2

essayez d'utiliser addAll au lieu d'ajouter –

Répondre

29

Utilisez Set.addAll()

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

En outre, vous devez saisir vos constructeurs (comme ci-dessus).

Pour faire cela en une méthode, essayez ceci:

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

En fait, nous allons aller complètement fou ... voici une méthode qui prendra un certain nombre de collections de tout type qui étend le type désiré, et les fusionne en un seul ensemble:

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

Vous ne voulez pas un ensemble. Comme vous l'avez découvert, ils n'ont pas d'éléments en double, par définition. Vous cherchez un Multiset (en fait, un SortedMultiset par les regards de celui-ci), également connu sous le nom de Bag. Java n'en a pas d'origine, mais il existe des implémentations open source disponibles, par exemple, Google's.

EDIT: Aussi, vous voulez faire setOne.addAll(setTwo), pas un élément à la fois, comme indiqué ci-dessus, mais c'est le problème secondaire.

+0

bien, en fait, je veux supprimer plus tard les doublons. –

+0

Ummm, ce n'est certainement pas ce que vous avez demandé à l'origine, car votre sortie d'échantillon a des doublons. –

+0

Quelle est la différence entre un * bag * et une * liste *? – Gabe

0

Ou alternativement utiliser une liste de tableaux de classement:

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

Cela n'éliminera pas les doublons. – rakeeee

0

Comme Bohemian mentioned, la meilleure réponse utilise Set.addAll(). Gardez juste à l'esprit que, si cela ne vous dérange pas d'écraser un de vos ensembles, il est plus efficace (du moins pour le développeur: P) d'ajouter directement un ensemble:

one.addAll(two); 
Questions connexes