java - san - música de cuerdas
¿Hay una mejor manera de combinar dos conjuntos de cuerdas en java? (9)
Necesito combinar dos conjuntos de cadenas mientras filtrado la información redundante, esta es la solución que se me ocurrió, ¿hay alguna manera mejor que cualquiera pueda sugerir? Tal vez algo construido en lo 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);
}
}
A partir de la definición, Set 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 ese
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;
}
Como un Set
no contiene entradas duplicadas, puede combinar las dos por:
newStringSet.addAll(oldStringSet);
No importa si agrega cosas dos veces, el conjunto solo contendrá el elemento una vez ... por ejemplo, no es necesario verificar usando el método contains
.
Lo mismo con Guava :
Set<Sting> combinedSet = Sets.union(oldStringSet, newStringSet)
Puedes hacerlo usando este one-liner
Set<String> combined = Stream.concat(newStringSet.stream(), oldStringSet.stream())
.collect(Collectors.toSet());
Con una importación estática, se ve aún mejor
Set<String> combined = concat(newStringSet.stream(), oldStringSet.stream())
.collect(toSet());
Otra forma es usar el método flatMap :
Set<String> combined = Stream.of(newStringSet, oldStringSet).flatMap(Set::stream)
.collect(toSet());
También cualquier colección podría combinarse fácilmente con un solo elemento
Set<String> combined = concat(newStringSet.stream(), Stream.of(singleValue))
.collect(toSet());
Solo use newStringSet.addAll(oldStringSet)
. No es necesario comprobar si hay duplicados, ya que la implementación de Set
ya lo hace.
Use 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 de manera efectiva este conjunto de modo 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 progreso.
newStringSet.addAll(oldStringSet)
http://docs.oracle.com/javase/7/docs/api/java/util/Set.html#addAll(java.util.Collection )
Como los conjuntos no pueden tener duplicados, simplemente agregar todos los elementos de uno al otro genera la unión correcta de los dos.
Set.addAll()
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 de manera efectiva este conjunto de modo que su valor sea la unión de los dos conjuntos
newStringSet.addAll(oldStringSet)
newStringSet.addAll(oldStringSet);
Esto producirá Unión de s1 y s2