#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());