239 votes

Comment faire pour convertir le tableau d’objets en tableau de chaînes en Java

J'utilise le code suivant pour convertir un tableau d'objets en un tableau String:

 Object Object_Array[]=new Object[100];
// ... get values in the Object_Array

String String_Array[]=new String[Object_Array.length];

for (int i=0;i<String_Array.length;i++) String_Array[i]=Object_Array[i].toString();
 

Mais je me demande s'il y a une autre façon de faire cela, quelque chose comme:

 String_Array=(String[])Object_Array;
 

Mais cela provoquerait une erreur d'exécution: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

Quelle est la bonne façon de le faire?

377voto

waxwing Points 10190

Une autre alternative à System.arraycopy :

 String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);
 

65voto

Vitalii Fedorenko Points 17469

En Java 8:

 String[] strings = Arrays.stream(objects).toArray(String[]::new);
 

61voto

Yishai Points 42417

System.arraycopy est probablement le moyen le plus efficace, mais pour l'esthétique, je préférerais:

  Arrays.asList(Object_Array).toArray(new String[Object_Array.length]);
 

50voto

Capagris Points 1971

Je vois que certaines solutions ont été fournis mais pas les causes, donc je vais vous expliquer cela en détail car je crois qu'il est aussi important de savoir que faisiez-vous le mal que juste pour obtenir "quelque chose" qui fonctionne à partir de la donnée des réponses.

Tout d'abord, voyons ce que l'Oracle a dire

 * <p>The returned array will be "safe" in that no references to it are
 * maintained by this list.  (In other words, this method must
 * allocate a new array even if this list is backed by an array).
 * The caller is thus free to modify the returned array.

Il peut ne pas sembler important, mais comme vous allez le voir, il est... Si ce n'est la ligne suivante à l'échec? Tout objet dans la liste de chaînes de caractères, mais il ne convertit pas, pourquoi?

List<String> tList = new ArrayList<String>();
tList.add("4");
tList.add("5");
String tArray[] = (String[]) tList.toArray();   

Sans doute, beaucoup d'entre vous pense que ce code est en train de faire la même chose, mais il ne le fait pas.

Object tSObjectArray[] = new String[2];
String tStringArray[] = (String[]) tSObjectArray;

Alors qu'en réalité, le code écrit est en train de faire quelque chose comme cela. La javadoc est dire! Il sera démarrent des instances d'un nouveau tableau, ce qu'il en sera de des Objets!!!

Object tSObjectArray[] = new Object[2];
String tStringArray[] = (String[]) tSObjectArray;   

Donc tList.toArray est l'instanciation d'un objet et non des Chaînes de...

Par conséquent, la solution naturelle qui n'a pas été mentionner dans ce fil, mais c'est ce que l'Oracle recommande est la suivante

String tArray[] = tList.toArray(new String[0]);

J'espère que c'est assez clair.

7voto

Richard Points 2017

Le framework de collections google propose une bonne méthode de transformation, de sorte que vous pouvez transformer vos objets en chaînes. Le seul inconvénient est que cela doit être d'Iterable à Iterable mais c'est ainsi que je le ferais:

 Iterable<Object> objects = ....... //Your chosen iterable here
Iterable<String> strings = com.google.common.collect.Iterables.transform(objects, new Function<Object, String>(){
        String apply(Object from){
             return from.toString();
        }
 });
 

Cela vous éloigne de l'utilisation des tableaux, mais je pense que ce serait ma façon préférée.

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