Me gustaría convertir una matriz a un conjunto en Java. Hay algunas formas obvias de hacer esto (es decir, con un bucle) pero me gustaría algo un poco más ordenado, algo como:
java.util.Arrays.asList(Object[] a);
¿Algunas ideas?
java
collections
arrays
set
Bob Gilmore
fuente
fuente

Arrays.asListes O (1).Eso es Collections.addAll (java.util.Collection, T ...) de JDK 6.
Además: ¿qué pasa si nuestra matriz está llena de primitivas?
Para JDK <8, simplemente escribiría el
forbucle obvio para hacer el ajuste y agregar al conjunto en una sola pasada.Para JDK> = 8, una opción atractiva es algo como:
fuente
java.util.Collections.addAll. Además, ya no recomendaría Commons Collections, ya que no se generó y no existe Guava.addAllserá O ( n ).Con guayaba puedes hacer:
fuente
new HashSet<T>(Arrays.asList(someArray)). Ver google.github.io/guava/releases/19.0/api/docs/com/google/common/…Java 8:
fuente
¡Varargs también funcionará!
fuente
Java 8
Tenemos la opción de usar
Streamtambién. Podemos obtener la transmisión de varias maneras:El código fuente de
Collectors.toSet()muestra que los elementos se agregan uno por uno a unaHashSetpero la especificación no garantiza que sea aHashSet.Por lo tanto, es mejor usar la opción posterior. El resultado es:
[A, B, C, D] [A, B, C, D] [A, B, C, D]Conjunto inmutable (Java 9)
Java 9 introdujo un
Set.ofmétodo de fábrica estático que devuelve un conjunto inmutable para los elementos proporcionados o la matriz.Comprobar métodos inmutables de fábrica estática establecida para obtener más información.
Conjunto inmutable (Java 10)
También podemos obtener un conjunto inmutable de dos maneras:
Set.copyOf(Arrays.asList(array))Arrays.stream(array).collect(Collectors.toUnmodifiableList());El método
Collectors.toUnmodifiableList()utiliza internamente elSet.ofintroducido en Java 9. También revise esta respuesta mía para obtener más información.fuente
Stream.of()- No lo sabía. Una pequeña objeción sobreCollectors.toSet(): usted dice que la especificación no garantiza agregar elementos uno por uno, pero eso es lo que significa: "se acumula ... en un nuevoSet". Y es más legible, tan preferible para mí, si no necesita las garantías de tipo concreto, mutabilidad, serialización y seguridad de rosca.HashSet. Solo garantiza que será unSety eso es lo que quiero decir. Espero haberlo aclarado.Después de hacerlo
Arrays.asList(array), puedes ejecutarSet set = new HashSet(list);Aquí hay un método de muestra, puede escribir:
fuente
En Eclipse Collections , lo siguiente funcionará:
Nota: Soy un committer para Eclipse Collections
fuente
Rápidamente: puedes hacer:
y para revertir
fuente
He escrito lo siguiente del consejo anterior: robarlo ... ¡es bueno!
fuente
Ha habido una gran cantidad de grandes respuestas ya, pero la mayoría de ellos no va a funcionar con gran variedad de primitivas (como
int[],long[],char[],byte[], etc.)En Java 8 y superior, puede encajonar la matriz con:
Luego convierta a set usando stream:
fuente
En algún momento, usar algunas bibliotecas estándar ayuda mucho. Intenta mirar las colecciones de Apache Commons . En este caso, sus problemas simplemente se transforman en algo como esto
Y aquí está el CollectionsUtils javadoc
fuente
java.util.Collections.addAll(myEmptySet, keys);??Usar
CollectionUtilsoArrayUtilsdestanford-postagger-3.0.jarfuente
En Java 10 :
Set.copyOfdevuelve un no modificable queSetcontiene los elementos de lo dadoCollection.Lo dado
Collectionno debe sernull, y no debe contener ningúnnullelemento.fuente
la salida es
cámbielo a
la salida es
fuente
Para cualquiera que resuelva para Android:
Solución de colecciones Kotlin
El asterisco
*es elspreadoperador. Aplica todos los elementos de una colección individualmente, cada uno pasado para unvarargparámetro de método. Es equivalente a:Si no se pasan parámetros, se
setOf()genera un conjunto vacío.Además
setOf, también puede usar cualquiera de estos para un tipo de hash específico:Así es como se define el tipo de elemento de colección explícitamente.
fuente
new HashSet<Object>(Arrays.asList(Object[] a));Pero creo que esto sería más eficiente:
fuente
HashSetse establece en función del tamaño de la matriz, por ejemplo.fuente