316 votes

Comment convertir Set<String> en String[] ?

J'ai besoin d'un String[] d'un Set<String> mais je ne sais pas comment faire. L'opération suivante échoue :

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 ?

5 votes

Avec le toArray() qui est clairement mentionnée dans la Javadoc.

2 votes

0 votes

Java 11 : utilisation des nouvelles toArray() méthode par défaut stackoverflow.com/a/32179686/1216775

513voto

BalusC Points 498232

Utilisez le Set#toArray(IntFunction<T[]>) méthode prenant un IntFunction comme générateur.

String[] GPXFILES1 = myset.toArray(String[]::new);

Si vous n'êtes pas encore sous Java 11, utilisez l'option Set#toArray(T[]) en prenant un argument de type tableau de la même taille.

String[] GPXFILES1 = myset.toArray(new String[myset.size()]);

Bien que n'étant pas encore sur Java 11, et vous ne pouvez pas garantir que myset n'est pas modifiable au moment de la conversion en tableau, alors il vaut mieux spécifier un tableau typé vide.

String[] GPXFILES1 = myset.toArray(new String[0]);

68voto

akhil_mittal Points 40

Java 11

La nouvelle valeur par défaut toArray méthode dans Collection permet de transférer les éléments de la collection vers un tableau nouvellement créé du type d'exécution souhaité. Il prend IntFunction<T[]> generator comme argument et peut être utilisé comme :

 String[] array = set.toArray(String[]::new);

Il existe déjà une méthode similaire Collection.toArray(T[]) et cet ajout signifie que nous ne serons plus en mesure de passer null comme argument car dans ce cas la référence à la méthode serait ambiguë. Mais c'est toujours bon puisque les deux méthodes lancent un NPE de toute façon.

Java 8

En Java 8, nous pouvons utiliser l'API streams :

String[] array = set.stream().toArray(String[]::new);

Nous pouvons également utiliser la version surchargée de la fonction toArray() qui prend IntFunction<A[]> generator comme :

String[] array = set.stream().toArray(n -> new String[n]);

Le but de la fonction 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 la première approche utilisant la méthode de référence que la seconde utilisant l'expression lambda.

43voto

JMelnik Points 3870

Utilisez toArray(T[] a) méthode :

String[] array = set.toArray(new String[0]);

26 votes

Lorsque vous passez à toArray() un tableau de taille trop petite, la méthode toArray() doit construire un nouveau tableau de taille correcte en utilisant la réflexion. Les performances sont nettement moins bonnes que si vous passez un tableau dont la taille est au moins égale à celle de la collection elle-même. C'est pourquoi [0] doit être remplacé par [myset.size()] comme dans la réponse acceptée.

13 votes

@k2col il semble que maintenant set.toArray(new String[0]) a une meilleure performance que set.toArray(new String[set.size()]

1 votes

Depuis Java 7, c'est l'approche privilégiée. Voir ce commentaire .

5voto

user7708 Points 111

Style goyave :

Set<String> myset = myMap.keySet();
FluentIterable.from(mySet).toArray(String.class);

Plus d'informations : https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/FluentIterable.html

2voto

Rafal Borowiec Points 406

En Java 11, nous pouvons utiliser Collection.toArray(generator) méthode. Le code suivant va créer un nouveau tableau de String :

Set<String> set = Set.of("one", "two", "three");
String[] array = set.toArray(String[]::new)

Voir : https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collection.html#toArray(java.util.function.IntFunction)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X