Necesito String[]
salir de un Set<String>
, pero no sé cómo hacerlo. Lo siguiente falla:
Map<String, ?> myMap = gpxlist.getAll();
Set<String> myset = myMap.keySet();
String[] GPXFILES1 = (String[]) myset.toArray(); // Here it fails.
¿Cómo puedo arreglarlo para que funcione?
toArray()
método que se menciona claramente en el Javadoc.toArray()
método predeterminado stackoverflow.com/a/32179686/1216775Respuestas:
Utilice el
Set#toArray(T[])
método tomando un argumento de matriz con tipo del mismo tamaño.También se puede usar un tamaño diferente, pero eso obligaría al
toArray()
método a crear una nueva matriz para que regrese en lugar de reutilizar el argumento proporcionado, que puede terminar siendo menos eficiente.Ver también el código fuente de
AbstractCollection#toArray()
.fuente
String[] GPXFILES1 = myset.toArray(new String[0]);
String[] GPXFILES1 = myset.toArray(new String[0])
y eso es recomendable. Actualiza la respuesta. "Desde las últimas actualizaciones de OpenJDK 6, esta llamada se intrinsificó, haciendo que el rendimiento de la versión de matriz vacía sea el mismo y, a veces, incluso mejor, en comparación con la versión de tamaño predeterminado. También es peligroso para una colección simultánea o sincronizada pasar una matriz de tamaño predeterminado. es posible una carrera de datos entre el tamaño y la llamada a la matriz que puede dar como resultado nulos adicionales al final de la matriz, si la colección se redujo simultáneamente durante la operación ". - Citado por la comunidad de Java.Java 11
El nuevo
toArray
método predeterminado en laCollection
interfaz permite que los elementos de la colección se transfieran a una matriz recién creada del tipo de tiempo de ejecución deseado. Se tomaIntFunction<T[]> generator
como argumento y se puede utilizar como:Ya existe un método similar
Collection.toArray(T[])
y esta adición significa que ya no podremos pasarlonull
como argumento porque en ese caso la referencia al método sería ambigua. Pero todavía está bien ya que ambos métodos arrojan un NPE de todos modos.Java 8
En Java 8 podemos usar secuencias API:
También podemos hacer uso de la versión sobrecargada de toArray () que toma
IntFunction<A[]> generator
como:El propósito de la función del generador aquí es tomar un número entero (tamaño de la matriz deseada) y producir una matriz del tamaño deseado. Personalmente, prefiero el primer enfoque con referencia de método que el último con expresión lambda.
fuente
stream()
usartoArray()
. Puede serset.toArray(new String[0])
set.toArray(new String[set.size()]);
Utilice el método toArray (T [] a) :
fuente
[0]
lo tanto, debe reemplazarse[myset.size()]
como en la respuesta aceptada.set.toArray(new String[0])
tiene un mejor rendimiento queset.toArray(new String[set.size()]
Estilo guayaba:
Más información: https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/FluentIterable.html
fuente
En Java 11 podemos usar el
Collection.toArray(generator)
método. El siguiente código creará una nueva matriz de cadenas:Ver: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collection.html#toArray(java.util.function.IntFunction)
fuente
fuente
Estaba enfrentando la misma situación.
Comienzo declarando las estructuras que necesito:
Set<String> myKeysInSet = null; String[] myArrayOfString = null;
En mi caso, tengo un objeto JSON y necesito que todas las claves en este JSON se almacenen en una matriz de cadenas. Usando la biblioteca GSON , uso JSON.keySet () para obtener las claves y moverme a mi Set:
myKeysInSet = json_any.keySet();
Con esto, tengo una estructura Set con todas las claves, ya que la necesitaba. Entonces solo necesito los valores para mi Array of Strings. Vea el código a continuación:
myArrayOfString = myKeysInSet.toArray(new String[myKeysInSet.size()]);
Esta fue mi primera respuesta en StackOverflow. Perdón por cualquier error: D
fuente