Necesito combinar dos conjuntos de cadenas mientras filtro información redundante, esta es la solución que se me ocurrió, ¿hay una manera mejor que alguien pueda sugerir? ¿Quizás algo incorporado que pasé por alto? No tuve suerte con Google.
Set<String> oldStringSet = getOldStringSet();
Set<String> newStringSet = getNewStringSet();
for(String currentString : oldStringSet)
{
if (!newStringSet.contains(currentString))
{
newStringSet.add(currentString);
}
}
addAll
y usar Streams es: • usarset1.addAll(set2)
tendrá el efecto secundario de cambiar físicamente el contenido deset1
. • Sin embargo, el uso de Streams siempre resultará en una nueva instancia deSet
contener el contenido de ambos conjuntos sin modificar ninguna de las instancias de Set originales. En mi humilde opinión, esta respuesta es mejor porque evita los efectos secundarios y la posibilidad de cambios inesperados en el conjunto original si se usara en otro lugar mientras se espera el contenido original. HTHLo mismo con Guayaba :
fuente
De la definición, el conjunto contiene solo elementos únicos.
Set<String> distinct = new HashSet<String>(); distinct.addAll(oldStringSet); distinct.addAll(newStringSet);
Para mejorar su código, puede crear un método genérico para eso
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; }
fuente
Si está usando Guava, también puede usar un constructor para obtener más flexibilidad:
ImmutableSet.<String>builder().addAll(someSet) .addAll(anotherSet) .add("A single string") .build();
fuente
Solo usa
newStringSet.addAll(oldStringSet)
. No es necesario verificar si hay duplicados, ya que laSet
implementación ya lo hace.fuente
http://docs.oracle.com/javase/7/docs/api/java/util/Set.html#addAll(java.util.Collection )
Dado que los conjuntos no pueden tener duplicados, simplemente agregar todos los elementos de uno al otro genera la unión correcta de los dos.
fuente
Esto producirá unión de s1 y s2
fuente
Usar
boolean addAll(Collection<? extends E> c)
Agrega todos los elementos de la colección especificada a este conjunto si aún no están presentes (operación opcional). Si la colección especificada también es un conjunto, la operación addAll modifica efectivamente este conjunto para que su valor sea la unión de los dos conjuntos. El comportamiento de esta operación no está definido si la colección especificada se modifica mientras la operación está en curso.
fuente
Si le importa el rendimiento, y si no necesita conservar sus dos conjuntos y uno de ellos puede ser enorme, le sugiero que compruebe cuál es el conjunto más grande y agregue los elementos del más pequeño.
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; }
De esta manera, si su nuevo conjunto tiene 10 elementos y su conjunto anterior tiene 100 000, solo realiza 10 operaciones en lugar de 100 000.
fuente
public boolean addAll(int index, Collection<? extends E> c, boolean checkSizes)
Si está utilizando Apache Common, utilice la
SetUtils
clase deorg.apache.commons.collections4.SetUtils;
fuente
SetView
, que es inmutable.Agrega todos los elementos de la colección especificada a este conjunto si aún no están presentes (operación opcional). Si la colección especificada también es un conjunto, la operación addAll modifica efectivamente este conjunto para que su valor sea la unión de los dos conjuntos
fuente