Come convertire array di oggetti in array di stringhe in Java


244

Uso il seguente codice per convertire un array di oggetti in un array di stringhe:

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();

Ma mi chiedo se c'è un altro modo per farlo, qualcosa del tipo:

String_Array=(String[])Object_Array;

Ma ciò causerebbe un errore di runtime: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

Qual è il modo corretto di farlo?


3
Mi piace la risposta di waxwing al meglio: String [] stringArray = Arrays.copyOf (objectArray, objectArray.length, String []. Class); È molto conciso e funziona. Ho contato quanto tempo ci vuole sia per la sua risposta che per il mio approccio attuale, sono praticamente gli stessi.
Frank,

Risposte:


381

Un'altra alternativa a System.arraycopy:

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

59
solo su Java 1.6 e versioni successive
newacct

10
Hrm. Non sono riuscito a far funzionare questo, in cui funziona l'esempio di lunga durata nella domanda originale. Genera java.lang.ArrayStoreException. Ricevo l'array di oggetti dal metodo toArray su una ArrayList generica contenente il mio tipo personalizzato. Non dovrebbe funzionare con farmaci generici o qualcosa del genere?
Ian Varley,

4
@Ian, il problema è che objectArray contiene oggetti non stringhe (vedi il commento di mmyer alla mia risposta che soffre dello stesso problema).
Yishai,

3
Ho appena provato questo approccio e, almeno nel mio caso, ho scoperto che le prestazioni non sono buone come lo sviluppo dell'array da solo ripetendo. (Peccato però, mi è piaciuto come one-liner!)
mdup

1
@mdup - piuttosto lungo un liner. avvolgerlo in un metodo forse.
MasterJoe2,

72

In Java 8:

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

Per convertire una matrice di altri tipi:

String[] strings = Arrays.stream(obj).map(Object::toString).
                   toArray(String[]::new);

2
Questo è un lavoro di bellezza e soddisfa il requisito di poter convertire esteticamente un array di oggetti non String in un array dei loro equivalenti toString. La risposta attualmente accettata non compie questo.
b4n4n4p4nd4,

Funziona ma se la tua lista contiene null otterrai una NullPointerException. Per aggirare il problema, consultare: stackoverflow.com/questions/4581407/…
Tony Falabella,

61

System.arraycopy è probabilmente il modo più efficiente, ma per l'estetica preferirei:

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

10
Funziona solo se gli oggetti sono tutti stringhe; il suo codice attuale funziona anche se non lo sono.
Michael Myers

Buon punto. Ho capito che ToString era solo un modo di lanciare una stringa, non l'intenzione di sostituire effettivamente gli oggetti con qualcos'altro. Se è quello che devi fare, il looping è l'unico modo.
Yishai,

questo non funziona in Android 2.3.3 .. mi dà un errore dicendo che il metodo copyof non è definito. Ho importato tutti i file giusti (ctrl + shift + I) .. ma non funziona ancora.
user590849,

3
@ user590849, la mia risposta non usa copyof. Ti riferisci a un'altra risposta?
Yishai,

50

Vedo che sono state fornite alcune soluzioni, ma non alcuna causa, quindi lo spiegherò in dettaglio poiché ritengo sia importante sapere che cosa hai fatto di sbagliato piuttosto che ottenere "qualcosa" che funzioni dalle risposte fornite.

Innanzitutto, vediamo cosa ha da dire Oracle

 * <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.

Potrebbe non sembrare importante, ma come vedrai è ... Quindi, cosa fallisce la seguente riga? Tutti gli oggetti nell'elenco sono String ma non li converte, perché?

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

Probabilmente, molti di voi penserebbero che questo codice stia facendo lo stesso, ma non lo è.

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

Quando in realtà il codice scritto sta facendo qualcosa del genere. Lo dice javadoc! Istituirà un nuovo array, quello che sarà degli Oggetti !!!

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

Quindi tList.toArray sta creando un'istanza di un oggetto e non di stringhe ...

Pertanto, la soluzione naturale che non è stata menzionata in questo thread, ma è ciò che Oracle consiglia è la seguente

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

Spero sia abbastanza chiaro.


Leggera prestazione di correzione saggia: String tArray [] = tList.toArray (new String [tList.size ()]); Altrimenti l'array deve essere ridimensionato di nuovo ...
Lonzak,

1
Buona spiegazione Solo un'altra cosa, se il consumo di memoria o le prestazioni sono un problema, non duplicare l'array. O cast un elemento in String ogni volta che ne hai bisogno (String)Object_Array[i]o Object_Array[i].toString()o allocare l'array come array String Object Object_Array[]=new String[100];... ottenere valori ... quindi cast String_Array=(String[])Object_Arrayche ora funziona.
Solostaran14

1
questo genera ArrayStoreException
iltaf khalid il

7

Il framework delle raccolte di google offre una citazione di un buon metodo di trasformazione, in modo da poter trasformare i tuoi oggetti in stringhe. L'unico aspetto negativo è che deve essere da Iterable a Iterable ma questo è il modo in cui lo farei:

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();
        }
 });

Questo ti allontana dall'uso delle matrici, ma penso che questo sarebbe il mio modo preferito.


1
@Yishai: no, le matrici non implementano Iterable. l'iterazione su di essi è appositamente definita nel JLS
newacct

@newacct, è vero, intendevo che gli array possono essere facilmente inseriti in un Iterable (Arrays.asList ()). Non so perché sia ​​uscito in quel modo.
Yishai,

5

Se vuoi ottenere una rappresentazione String degli oggetti nella tua matrice, allora sì, non c'è altro modo per farlo.

Se sai che l'array Object contiene solo stringhe, puoi anche fare (istruzioni per chiamare toString ()):

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

L'unico caso in cui potresti usare il cast su String [] di Object_Array sarebbe se l'array a cui fa riferimento fosse effettivamente definito come String [], ad esempio questo funzionerebbe:

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

5

Questo è carino, ma non funziona come notato da mmyer, a causa delle parentesi quadre:

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

Questo è brutto ma funziona:

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

Se usi questo codice devi essere sicuro che le stringhe restituite dai tuoi oggetti 'toString () non contengono virgole.


1
Suggerimento interessante, ma dovresti prima rimuovere il [e] sul primo e sull'ultimo elemento.
Michael Myers

1
stupendo fino a quando non svolge il lavoro :)
AZ_

2
Questo non funziona se una stringa contiene una virgola (,)
Andreas Berger,

2

Per la tua idea, in realtà ti stai avvicinando al successo, ma se lo fai in questo modo dovrebbe andare bene:

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

A proposito, l'uso del metodo di utilità Array è abbastanza buono e rende elegante il codice.


1
Object arr3[]=list1.toArray();
   String common[]=new String[arr3.length];

   for (int i=0;i<arr3.length;i++) 
   {
   common[i]=(String)arr3[i];
  }

1

È possibile utilizzare il convertitore di tipi . Per convertire un array di qualsiasi tipo in array di stringhe puoi registrare il tuo convertitore:

 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;
        }
    });

e usalo

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

0

Cambia facilmente senza alcun headche Converti qualsiasi array di oggetti in array di stringhe Oggetto drivex [] = {1,2};

    for(int i=0; i<drive.length ; i++)
        {
            Str[i]= drivex[i].toString();
            System.out.println(Str[i]); 
        }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.