Comment convertir un tableau d'objets en tableau de chaînes en Java

J'utilise le code suivant pour convertir un tableau D'objets en un tableau de Chaînes:

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 le faire, 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 ?

223
demandé sur Kristian Glass 2009-06-19 20:00:04

11 réponses

. une Autre alternative à System.arraycopy:

String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);
352
répondu waxwing 2009-06-19 16:11:44

Système.arraycopy est probablement le moyen le plus efficace, mais pour l'esthétique, je préfère:

 Arrays.asList(Object_Array).toArray(new String[Object_Array.length]);
56
répondu Yishai 2009-06-19 16:08:05

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

Tout d'abord, voyons ce Qu'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.

Cela n'a peut-être pas l'air important, mais comme vous le verrez... Alors, qu'est-ce que la ligne suivante échoue? Tous les objets de la liste sont des chaînes mais ils ne les convertissent pas, pourquoi?

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

Probablement, beaucoup de vous penseriez que ce code fait la même chose, mais ce n'est pas le cas.

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

Quand en réalité le code écrit fait quelque chose comme ça. Le javadoc le dit! Il va instatiate un nouveau tableau, ce qu'il sera des objets!!!

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

Donc tList.toArray instancie un objet et non des chaînes...

Par conséquent, la solution naturelle qui n'a pas été mentionnée dans ce fil, mais C'est ce que recommande Oracle est la suivante

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

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

49
répondu Capagris 2012-11-30 14:25:34

Dans Java 8:

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

Pour convertir un tableau d'autres types:

String[] strings = Arrays.stream(obj).map(Object::toString).
                   toArray(String[]::new);
48
répondu Vitalii Fedorenko 2015-02-24 01:45:49

Le framework Google collections offre une bonne méthode de transformation,de sorte que vous pouvez transformer vos objets en chaînes. Le seul inconvénient est qu'il doit être de itérable à itérable mais c'est la façon dont 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 évite d'utiliser des tableaux,mais je pense que ce serait ma façon préférée.

7
répondu Richard 2009-06-19 16:08:49

Si vous voulez obtenir une représentation sous forme de chaîne des objets dans votre tableau, alors oui, il n'y a pas d'autre moyen de le faire.

Si vous savez que votre tableau D'objets contient uniquement des chaînes, vous pouvez également faire (instread d'appeler toString ()):

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

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

    Object[] o = new String[10];
    String[] s = (String[]) o;
5
répondu david a. 2009-06-19 16:11:51

Celui-ci est sympa, mais ne fonctionne pas comme mmyers l'a remarqué, à cause des crochets:

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

Celui-ci est laid mais fonctionne:

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

Si vous utilisez ce code, vous devez être sûr que les chaînes renvoyées par ToString () de vos objets ne contiennent pas de virgules.

4
répondu Ilya Boyandin 2009-06-19 16:33:08

Pour votre idée, en fait vous approchez du succès, mais si vous faites comme cela devrait être bien:

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

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

2
répondu ttt 2011-11-24 00:08:16
Object arr3[]=list1.toArray();
   String common[]=new String[arr3.length];

   for (int i=0;i<arr3.length;i++) 
   {
   common[i]=(String)arr3[i];
  }
1
répondu Amit Kumar Sagar 2015-01-07 06:53:26

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

 TypeConverter.registerConverter(Object[].class, String[].class, new Converter<Object[], String[]>() {

        @Override
        public String[] convert(Object[] source) {
            String[] strings = new String[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'};
   String[] strings = TypeConverter.convert(objects, String[].class);
1
répondu lstypka 2015-05-23 15:29:46

Facilement changer sans aucun headche Convertir n'importe quel tableau d'objets en tableau de chaînes Objet drivex[] = {1,2};

    for(int i=0; i<drive.length ; i++)
        {
            Str[i]= drivex[i].toString();
            System.out.println(Str[i]); 
        }
0
répondu Rahul Chhangani 2013-12-10 11:23:39