Preciso combinar dois conjuntos de strings ao filtrar as informações redundantes. Essa é a solução que encontrei. Existe uma maneira melhor que alguém possa sugerir? Talvez algo embutido que eu esqueci? Não tive sorte com o google.
Set<String> oldStringSet = getOldStringSet();
Set<String> newStringSet = getNewStringSet();
for(String currentString : oldStringSet)
{
if (!newStringSet.contains(currentString))
{
newStringSet.add(currentString);
}
}
addAll
e usando Streams é: • o usoset1.addAll(set2)
terá o efeito colateral de alterar fisicamente o conteúdo deset1
. • No entanto, o uso de Streams sempre resultará em uma nova instânciaSet
contendo o conteúdo de ambos os conjuntos sem modificar nenhuma das instâncias Set originais. IMHO esta resposta é melhor porque evita efeitos colaterais e potencial para mudanças inesperadas no conjunto original se fosse usado em outro lugar enquanto esperava o conteúdo original. HTHO mesmo com a goiaba :
fonte
Da definição, o conjunto contém apenas elementos únicos.
Set<String> distinct = new HashSet<String>(); distinct.addAll(oldStringSet); distinct.addAll(newStringSet);
Para aprimorar seu código, você pode criar um método genérico para que
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; }
fonte
Se você estiver usando Guava, também pode usar um construtor para obter mais flexibilidade:
ImmutableSet.<String>builder().addAll(someSet) .addAll(anotherSet) .add("A single string") .build();
fonte
Basta usar
newStringSet.addAll(oldStringSet)
. Não há necessidade de verificar se há duplicatas, pois aSet
implementação já faz isso.fonte
http://docs.oracle.com/javase/7/docs/api/java/util/Set.html#addAll(java.util.Collection )
Como os conjuntos não podem ter duplicatas, apenas adicionar todos os elementos de um ao outro gera a união correta dos dois.
fonte
Isso produzirá União de s1 e s2
fonte
Use
boolean addAll(Collection<? extends E> c)
Adiciona todos os elementos da coleção especificada a este conjunto se eles ainda não estiverem presentes (operação opcional). Se a coleção especificada também for um conjunto, a operação addAll modifica efetivamente esse conjunto para que seu valor seja a união dos dois conjuntos. O comportamento desta operação é indefinido se a coleção especificada for modificada enquanto a operação estiver em andamento.
fonte
Se você se preocupa com o desempenho e não precisa manter seus dois conjuntos e um deles pode ser enorme, sugiro verificar qual conjunto é o maior e adicionar os elementos dos menores.
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; }
Dessa forma, se o seu novo conjunto tiver 10 elementos e o antigo tiver 100.000, você só fará 10 operações em vez de 100.000.
fonte
public boolean addAll(int index, Collection<? extends E> c, boolean checkSizes)
Se você estiver usando o Apache Common, use a
SetUtils
classe deorg.apache.commons.collections4.SetUtils;
fonte
SetView
, que é imutável.SetView
é sempre uma operação linear.Adiciona todos os elementos da coleção especificada a este conjunto, se ainda não estiverem presentes (operação opcional). Se a coleção especificada também for um conjunto, a operação addAll modifica efetivamente esse conjunto para que seu valor seja a união dos dois conjuntos
fonte