Мне нужно объединить два набора строк при фильтрации избыточной информации, это решение, которое я придумал, есть ли лучший способ, который можно предложить? Возможно, что-то встроенное в то, что я не заметил? Не повезло с гуглом.
Set<String> oldStringSet = getOldStringSet();
Set<String> newStringSet = getNewStringSet();
for(String currentString : oldStringSet)
{
if (!newStringSet.contains(currentString))
{
newStringSet.add(currentString);
}
}
addAll
использованием Streams заключается в следующем: • использованиеset1.addAll(set2)
будет иметь побочный эффект физического изменения содержимогоset1
. • Однако использование Streams всегда будет приводить к созданию нового экземпляра,Set
содержащего содержимое обоих наборов, без изменения любого из исходных экземпляров Set. IMHO этот ответ лучше, потому что он позволяет избежать побочных эффектов и возможности неожиданных изменений в исходном наборе, если он будет использоваться в другом месте, ожидая исходного содержимого. HTHТо же и с Гуавой :
источник
Из определения Set содержат только уникальные элементы.
Set<String> distinct = new HashSet<String>(); distinct.addAll(oldStringSet); distinct.addAll(newStringSet);
Чтобы улучшить свой код, вы можете создать общий метод для этого
public static <T> Set<T> distinct(Collection<T>... lists) { Set<T> distinct = new HashSet<T>(); for(Collection<T> list : lists) { distinct.addAll(list); } return distinct; }
источник
Если вы используете Guava, вы также можете использовать конструктор для большей гибкости:
ImmutableSet.<String>builder().addAll(someSet) .addAll(anotherSet) .add("A single string") .build();
источник
Просто используйте
newStringSet.addAll(oldStringSet)
. Нет необходимости проверять дубликаты, посколькуSet
реализация это уже делает.источник
http://docs.oracle.com/javase/7/docs/api/java/util/Set.html#addAll(java.util.Collection )
Поскольку в наборах не может быть дубликатов, простое добавление всех элементов одного к другому генерирует правильное объединение двух.
источник
Это произведет объединение s1 и s2
источник
Использовать
boolean addAll(Collection<? extends E> c)
Добавляет все элементы в указанной коллекции в этот набор, если они еще не присутствуют (необязательная операция). Если указанная коллекция также является набором, операция addAll эффективно изменяет этот набор, так что его значение является объединением двух наборов. Поведение этой операции не определено, если указанная коллекция изменяется во время выполнения операции.
источник
Если вы заботитесь о производительности и вам не нужно хранить два набора, и один из них может быть огромным, я бы посоветовал проверить, какой набор самый большой, и добавить элементы из самого маленького.
Set<String> newStringSet = getNewStringSet(); Set<String> oldStringSet = getOldStringSet(); Set<String> myResult; if(oldStringSet.size() > newStringSet.size()){ oldStringSet.addAll(newStringSet); myResult = oldStringSet; } else{ newStringSet.addAll(oldStringSet); myResult = newStringSet; }
Таким образом, если в вашем новом наборе 10 элементов, а в старом - 100 000, вы выполняете только 10 операций вместо 100 000.
источник
public boolean addAll(int index, Collection<? extends E> c, boolean checkSizes)
Если вы используете Apache Common, используйте
SetUtils
класс изorg.apache.commons.collections4.SetUtils;
источник
SetView
неизменяемый.Добавляет все элементы в указанной коллекции в этот набор, если они еще не присутствуют (необязательная операция). Если указанная коллекция также является набором, операция addAll эффективно изменяет этот набор, так что его значение является объединением двух наборов
источник