Je dois obtenir un String[]
d'un Set<String>
, mais je ne sais pas comment le faire. Les échecs suivants:
Map<String, ?> myMap = gpxlist.getAll();
Set<String> myset = myMap.keySet();
String[] GPXFILES1 = (String[]) myset.toArray(); // Here it fails.
Comment puis-je le réparer pour qu'il fonctionne?
toArray()
méthode qui est clairement mentionnée dans le Javadoc.toArray()
méthode par défaut stackoverflow.com/a/32179686/1216775Réponses:
Utilisez la
Set#toArray(T[])
méthode en prenant un argument de tableau typé de la même taille.Une taille différente peut également être utilisée, mais cela forcerait la
toArray()
méthode à créer un nouveau tableau à retourner au lieu de réutiliser l'argument fourni, ce qui pourrait s'avérer moins efficace.Voir aussi le code source de
AbstractCollection#toArray()
.la source
String[] GPXFILES1 = myset.toArray(new String[0]);
String[] GPXFILES1 = myset.toArray(new String[0])
et c'est recommandé. Mettez à jour la réponse. "Depuis les dernières mises à jour d'OpenJDK 6, cet appel a été intrinsèque, ce qui rend les performances de la version de baie vide identiques et parfois même meilleures, par rapport à la version prédéfinie. une course aux données est possible entre la taille et l'appel toArray, ce qui peut entraîner des valeurs Null supplémentaires à la fin du tableau, si la collection a été réduite simultanément pendant l'opération. " - cité par la communauté java.Java 11
La nouvelle
toArray
méthode par défaut dans l'Collection
interface permet de transférer les éléments de la collection vers un tableau nouvellement créé du type d'exécution souhaité. Il prendIntFunction<T[]> generator
comme argument et peut être utilisé comme:Il existe déjà une méthode similaire
Collection.toArray(T[])
et cet ajout signifie que nous ne pouvons plus passernull
d'argument car dans ce cas, la référence à la méthode serait ambiguë. Mais tout va bien puisque les deux méthodes lancent quand même un NPE.Java 8
En Java 8, nous pouvons utiliser l'API streams:
Nous pouvons également utiliser la version surchargée de toArray () qui prend
IntFunction<A[]> generator
comme:Le but de la fonction de générateur ici est de prendre un entier (taille du tableau souhaité) et de produire un tableau de la taille souhaitée. Personnellement, je préfère l'ancienne approche utilisant la référence de méthode que la dernière utilisant l'expression lambda.
la source
stream()
d'utilisertoArray()
. Ça peut êtreset.toArray(new String[0])
set.toArray(new String[set.size()]);
Utilisez la méthode toArray (T [] a) :
la source
[0]
devrait être remplacé par[myset.size()]
comme dans la réponse acceptée.set.toArray(new String[0])
a une meilleure performance queset.toArray(new String[set.size()]
Style de goyave:
plus d'informations: https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/FluentIterable.html
la source
En Java 11, nous pouvons utiliser la
Collection.toArray(generator)
méthode. Le code suivant créera un nouveau tableau de String:Voir: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collection.html#toArray(java.util.function.IntFunction)
la source
la source
J'étais confronté à la même situation.
Je commence par déclarer les structures dont j'ai besoin:
Set<String> myKeysInSet = null; String[] myArrayOfString = null;
Dans mon cas, j'ai un objet JSON et j'ai besoin que toutes les clés de ce JSON soient stockées dans un tableau de chaînes. En utilisant la bibliothèque GSON , j'utilise JSON.keySet () pour obtenir les clés et passer à mon Set:
myKeysInSet = json_any.keySet();
Avec cela, j'ai une structure Set avec toutes les clés, comme j'en avais besoin. J'ai donc juste besoin des valeurs de mon tableau de cordes. Voir le code ci-dessous:
myArrayOfString = myKeysInSet.toArray(new String[myKeysInSet.size()]);
C'était ma première réponse dans StackOverflow. Désolé pour toute erreur: D
la source