Comment convertir un tableau d’objects en tableau de chaînes en Java

J’utilise le code suivant pour convertir un tableau Object en un tableau Ssortingng:

Object Object_Array[]=new Object[100]; // ... get values in the Object_Array Ssortingng Ssortingng_Array[]=new Ssortingng[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, quelque chose comme:

 Ssortingng_Array=(Ssortingng[])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.Ssortingng; Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Ssortingng;

Quelle est la bonne façon de le faire?

Une autre alternative à System.arraycopy :

 Ssortingng[] ssortingngArray = Arrays.copyOf(objectArray, objectArray.length, Ssortingng[].class); 

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

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

Je vois que certaines solutions ont été apscopes mais pas de causes, alors je vais vous expliquer cela en détail car je pense qu’il est aussi important de savoir ce que vous avez fait de mal pour obtenir «quelque chose» à partir des réponses données.

Tout d’abord, voyons ce que Oracle a à dire

  * 

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.

Cela peut ne pas sembler important, mais comme vous le verrez, alors … Qu’est-ce que la ligne suivante échoue? Tous les objects de la liste sont Ssortingng mais ne les convertissent pas, pourquoi?

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

Beaucoup d’entre vous pensent probablement que ce code fait la même chose, mais ce n’est pas le cas.

 Object tSObjectArray[] = new Ssortingng[2]; Ssortingng tSsortingngArray[] = (Ssortingng[]) tSObjectArray; 

Quand en réalité le code écrit fait quelque chose comme ça. Le javadoc le dit! Il va instater un nouveau tableau, ce qu’il sera d’objects!

 Object tSObjectArray[] = new Object[2]; Ssortingng tSsortingngArray[] = (Ssortingng[]) tSObjectArray; 

Donc, tList.toArray instancie un object et non une chaîne …

Par conséquent, la solution naturelle qui n’a pas été mentionnée dans ce fil, mais c’est ce que recommande Oracle:

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

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

Dans Java 8:

 Ssortingng[] ssortingngs = Arrays.stream(objects).toArray(Ssortingng[]::new); 

Pour convertir un tableau d’autres types:

 Ssortingng[] ssortingngs = Arrays.stream(obj).map(Object::toSsortingng). toArray(Ssortingng[]::new); 

Le framework de collections google propose une méthode de transformation efficace, de sorte que vous pouvez transformer vos objects en chaînes. Le seul inconvénient est que cela doit être de Iterable à Iterable, mais c’est comme ça que je le ferais:

 Iterable objects = ....... //Your chosen iterable here Iterable ssortingngs = com.google.common.collect.Iterables.transform(objects, new Function(){ Ssortingng apply(Object from){ return from.toSsortingng(); } }); 

Cela vous évite d’utiliser des tableaux, mais je pense que ce serait ma façon préférée.

Si vous voulez obtenir une représentation Ssortingng des objects de votre tableau, alors oui, il n’y a pas d’autre moyen de le faire.

Si vous savez que votre tableau d’objects ne contient que des chaînes, vous pouvez également le faire (vous devez savoir comment appeler toSsortingng ()):

 for (int i=0;i 

Le seul cas où vous pourriez utiliser le cast pour Ssortingng [] du Object_Array serait si le tableau auquel il fait référence serait effectivement défini comme Ssortingng [], par exemple cela fonctionnerait:

  Object[] o = new Ssortingng[10]; Ssortingng[] s = (Ssortingng[]) o; 

Celui-ci est sympa, mais ne fonctionne pas comme le notent les mmyers, à cause des crochets:

Arrays.toSsortingng(objectArray).split(",")

Celui-ci est moche mais fonctionne:

Arrays.toSsortingng(objectArray).replaceFirst("^\\[", "").replaceFirst("\\]$", "").split(",")

Si vous utilisez ce code, vous devez vous assurer que les chaînes renvoyées par toSsortingng () de vos objects ne contiennent pas de virgules.

Pour votre idée, en fait, vous approchez du succès, mais si vous aimez ça, ça devrait aller:

 for (int i=0;i 

BTW, l'utilisation de la méthode utilitaire Arrays est assez bonne et rend le code élégant.

 Object arr3[]=list1.toArray(); Ssortingng common[]=new Ssortingng[arr3.length]; for (int i=0;i 

Vous pouvez utiliser le convertisseur de type . Pour convertir un tableau de tous types en tableau de chaînes, vous pouvez enregistrer votre propre convertisseur:

  TypeConverter.registerConverter(Object[].class, Ssortingng[].class, new Converter() { @Override public Ssortingng[] convert(Object[] source) { Ssortingng[] ssortingngs = new Ssortingng[source.length]; for(int i = 0; i < source.length ; i++) { strings[i] = source[i].toString(); } return strings; } }); 

et l'utiliser

  Object[] objects = new Object[] {1, 23.43, true, "text", 'c'}; Ssortingng[] ssortingngs = TypeConverter.convert(objects, Ssortingng[].class); 

Changez facilement sans en-tête Convertissez n’importe quel tableau d’objects en un tableau Objet drivex [] = {1,2};

  for(int i=0; i