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.asList
es 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
for
bucle 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.addAll
será 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
Stream
tambié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 unaHashSet
pero 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.of
mé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.of
introducido 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á unSet
y 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
CollectionUtils
oArrayUtils
destanford-postagger-3.0.jar
fuente
En Java 10 :
Set.copyOf
devuelve un no modificable queSet
contiene los elementos de lo dadoCollection
.Lo dado
Collection
no debe sernull
, y no debe contener ningúnnull
elemento.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 elspread
operador. Aplica todos los elementos de una colección individualmente, cada uno pasado para unvararg
pará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
HashSet
se establece en función del tamaño de la matriz, por ejemplo.fuente