объединение нескольких наборов в один и удаление дубликатов

#java

#java

Вопрос:

У меня есть m наборов, которые можно сохранить с помощью array или arraylist. Среди этих наборов есть совпадения. Я хотел бы объединить эти m наборов в один набор, и эти повторяющиеся элементы будут занимать только одно место в объединенном наборе. Какой тип структуры данных и операции я должен использовать для построения объединенного набора.

Комментарии:

1. Набор ?

Ответ №1:

Смотрите: javadoc java.util.Set.addAll(Коллекция):

 /**
 * Adds all of the elements in the specified collection to this set if
 * they're not already present (optional operation).  If the specified
 * collection is also a set, the <tt>addAll</tt> operation effectively
 * modifies this set so that its value is the <i>union</i> of the two
 * sets.  The behavior of this operation is undefined if the specified
 * collection is modified while the operation is in progress.
  

Ответ №2:

 /**
 * Join multiple sets into one.
 */
@SafeVarargs
private final <T> Set<T> join(Set<T>... sets)
{
    Set<T> result = new HashSet<>();
    if (sets == null)
        return resu<

    for (Set<T> set : sets)
    {
        if (set != null)
            result.addAll(set);
    }
    return resu<
}
  

Ответ №3:

Этот код сделает это за вас:

     Set set = new HashSet();
    ArrayList list = new ArrayList();
    ArrayList list2 = new ArrayList(); //etc
    Object[] array = new Object[]{};
    Object[] array2 = new Object[]{}; // etc
    set.addAll(list);
    set.addAll(list2);
    set.addAll(Arrays.asList(array));
    set.addAll(Arrays.asList(array2));
    // Call addAll as many times as you like
  

set теперь содержит все уникальные значения по одному разу для каждого

Ответ №4:

Вы должны хранить их в java.util.Set в первую очередь.

Ответ №5:

В Apache Commons есть ListOrderedSet. Он сочетает в себе преимущества набора (а именно, каждый элемент встречается только один раз) с преимуществами списка (итерация в порядке добавления).

С его помощью делайте то, что предлагали другие:

  • Создайте новый ListOrderedSet lOS.
  • Добавьте в него все свои элементы, используя lOS.addAll(yourElements).

Ответ №6:

Начиная с Java 8, вы можете использовать stream для объединения нескольких наборов в один

 Set<Long> ALL_IN_ONE = Stream.of(SET1, SET2).flatMap(Set::stream).collect(Collectors.toSet());