Добавление элементов из двух наборов - PullRequest
11 голосов
/ 07 ноября 2011

Как добавить элементы из двух наборов?

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 работает только для одного целого числа, а не для набора целых чисел. Есть ли способ, где я могу добавить два набора вместе?

Я также должен вернуть набор. Как мне это сделать?

Ответы [ 4 ]

36 голосов
/ 07 ноября 2011

Использование 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 голосов
/ 13 января 2017

Как сказал Богемский , лучший ответ - использование Set.addAll (). Просто имейте в виду, что, если вы не возражаете переписать один из своих наборов, более эффективно (по крайней мере, с точки зрения времени разработчика: P) добавить один набор непосредственно в другой набор:

one.addAll(two);
2 голосов
/ 07 ноября 2011

Вы не хотите набор.Как вы обнаружили, они не имеют дублирующих элементов по определению.Вы ищете Multiset (на самом деле это SortedMultiset), также известный как Bag .Java не имеет ни одного стандартного решения, но есть доступные реализации с открытым исходным кодом, например, Google's .

РЕДАКТИРОВАТЬ: Кроме того, вы хотите сделать setOne.addAll(setTwo), а не одинэлемент за один раз, как указано выше, но это вторичная проблема.

0 голосов
/ 07 ноября 2011

Или поочередно используйте отсортированный ArrayList:

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