So konvertieren Sie ein Objektarray in ein Stringarray in Java

244

Ich verwende den folgenden Code, um ein Object-Array in ein String-Array zu konvertieren:

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

Aber ich frage mich, ob es einen anderen Weg gibt, so etwas wie:

String_Array=(String[])Object_Array;

Dies würde jedoch einen Laufzeitfehler verursachen: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

Was ist der richtige Weg, um es zu tun?

Frank
quelle
3
Die Antwort von Waxwing gefällt mir am besten: String [] stringArray = Arrays.copyOf (objectArray, objectArray.length, String []. Class); Es ist sehr prägnant und funktioniert. Ich habe gezählt, wie viel Zeit sowohl für seine Antwort als auch für meinen aktuellen Ansatz benötigt wird. Sie sind ziemlich gleich.
Frank

Antworten:

381

Eine weitere Alternative zu System.arraycopy:

String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);
Seidenschwanz
quelle
59
nur auf Java 1.6 und höher
newacct
10
Hrm. Ich konnte dieses nicht zum Laufen bringen, wo das Langform-Beispiel in der ursprünglichen Frage funktioniert. Es wird eine java.lang.ArrayStoreException ausgelöst. Ich erhalte das Objektarray von der toArray-Methode in einer generischen ArrayList, die meinen benutzerdefinierten Typ enthält. Wird nicht erwartet, dass dies mit Generika oder so funktioniert?
Ian Varley
4
@ Ian, das Problem ist, dass objectArray Objekte statt Strings enthält (siehe mmyers Kommentar zu meiner Antwort, die unter dem gleichen Problem leidet).
Yishai
3
Ich habe gerade diesen Ansatz ausprobiert und zumindest in meinem Fall festgestellt, dass die Leistung nicht so gut ist wie das Erstellen des Arrays selbst durch Iteration. (Schade, ich mochte es als
Einzeiler
1
@mdup - ziemlich langer Einzeiler. wickeln Sie es vielleicht in eine Methode ein.
MasterJoe2
72

In Java 8:

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

So konvertieren Sie ein Array anderer Typen:

String[] strings = Arrays.stream(obj).map(Object::toString).
                   toArray(String[]::new);
Vitalii Fedorenko
quelle
2
Dies ist eine Arbeit von Schönheit und erfüllt die Anforderung, ein Nicht-String-Objektarray ästhetisch in ein Array ihrer toString-Äquivalente konvertieren zu können. Die aktuell akzeptierte Antwort führt dies nicht aus.
b4n4n4p4nd4
Dies funktioniert, aber wenn Ihre Liste Nullen enthält, erhalten Sie eine NullPointerException. Um dieses Problem zu umgehen
Tony Falabella
61

System.arraycopy ist wahrscheinlich der effizienteste Weg, aber aus ästhetischen Gründen würde ich Folgendes bevorzugen:

 Arrays.asList(Object_Array).toArray(new String[Object_Array.length]);
Yishai
quelle
10
Das funktioniert nur, wenn die Objekte alle Strings sind. Sein aktueller Code funktioniert auch dann, wenn dies nicht der Fall ist.
Michael Myers
Guter Punkt. Ich verstand den toString nur als eine Möglichkeit, einen String zu gießen, und nicht als die Absicht, die Objekte tatsächlich durch etwas anderes zu ersetzen. Wenn Sie dies tun müssen, ist das Schleifen der einzige Weg.
Yishai
Dies funktioniert nicht in Android 2.3.3. Es gibt eine Fehlermeldung, dass die copyof-Methode nicht definiert ist. Ich habe alle richtigen Dateien importiert (Strg + Umschalt + I). Aber es funktioniert immer noch nicht.
user590849
3
@ user590849, meine Antwort wird nicht verwendet copyof. Beziehen Sie sich auf eine andere Antwort?
Yishai
50

Ich sehe, dass einige Lösungen bereitgestellt wurden, aber keine Ursachen, daher werde ich dies ausführlich erläutern, da ich glaube, dass es genauso wichtig ist zu wissen, was Sie falsch gemacht haben, nur um "etwas" zu erhalten, das aus den gegebenen Antworten funktioniert.

Lassen Sie uns zunächst sehen, was Oracle zu sagen hat

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

Es mag nicht wichtig aussehen, aber wie Sie sehen werden, ist es ... Also, was schlägt die folgende Zeile fehl? Alle Objekte in der Liste sind Zeichenfolgen, werden jedoch nicht konvertiert. Warum?

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

Wahrscheinlich würden viele von Ihnen denken, dass dieser Code dasselbe tut, aber das tut er nicht.

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

In Wirklichkeit macht der geschriebene Code so etwas. Der Javadoc sagt es! Es wird ein neues Array initiieren, was es von Objekten sein wird !!!

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

Also instanziiert tList.toArray ein Objekt und keine Zeichenfolgen ...

Daher ist die natürliche Lösung, die in diesem Thread nicht erwähnt wurde, aber von Oracle empfohlen wird, die folgende

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

Hoffe es ist klar genug.

Capagris
quelle
Leichte Korrekturleistung: String tArray [] = tList.toArray (neuer String [tList.size ()]); Andernfalls muss die Größe des Arrays erneut
geändert
1
Gute Erklärung. Nur noch eine Sache: Wenn Speicherverbrauch oder Leistung ein Problem darstellen, duplizieren Sie das Array nicht. Entweder ein Element in String umwandeln, wann immer Sie es benötigen, (String)Object_Array[i]oder Object_Array[i].toString()das Array als String-Array zuweisen Object Object_Array[]=new String[100];... Werte abrufen ... dann umwandeln, String_Array=(String[])Object_Arraywas jetzt funktioniert.
Solostaran14
1
Dies löst ArrayStoreException
iltaf khalid
7

Das Google-Sammlungsframework bietet eine gute Transformationsmethode, mit der Sie Ihre Objekte in Zeichenfolgen umwandeln können. Der einzige Nachteil ist, dass es von Iterable zu Iterable sein muss, aber so würde ich es machen:

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

Dies nimmt Sie von der Verwendung von Arrays ab, aber ich denke, dies wäre mein bevorzugter Weg.

Richard
quelle
1
@ Yishai: Nein, Arrays implementieren Iterable nicht. Die Iteration über sie ist speziell in der JLS
Newacct
@newacct, ganz richtig, ich meinte, Arrays können einfach in eine Iterable (Arrays.asList ()) eingeschlossen werden. Ich weiß nicht, warum es so herauskam.
Yishai
5

Wenn Sie eine String-Darstellung der Objekte in Ihrem Array erhalten möchten, gibt es keine andere Möglichkeit.

Wenn Sie wissen, dass Ihr Object-Array nur Strings enthält, können Sie dies auch tun (anstelle des Aufrufs von toString ()):

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

Der einzige Fall, in dem Sie die Umwandlung in String [] des Object_Array verwenden könnten, wäre, wenn das Array, auf das es verweist, tatsächlich als String [] definiert wäre, z. B. würde dies funktionieren:

    Object[] o = new String[10];
    String[] s = (String[]) o;
David a.
quelle
5

Dieser ist nett, funktioniert aber aufgrund der eckigen Klammern nicht so, wie mmyers bemerkt hat:

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

Dieser ist hässlich, funktioniert aber:

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

Wenn Sie diesen Code verwenden, müssen Sie sicherstellen, dass die von toString () Ihrer Objekte zurückgegebenen Zeichenfolgen keine Kommas enthalten.

Ilya Boyandin
quelle
1
Interessanter Vorschlag, aber Sie müssten zuerst das [und] des ersten und letzten Elements entfernen.
Michael Myers
1
wunderschön, bis es den Job ausführt :)
AZ_
2
Dies funktioniert nicht, wenn ein String ein Komma (,) enthält
Andreas Berger
2

Für Ihre Idee nähern Sie sich tatsächlich dem Erfolg, aber wenn Sie dies mögen, sollte es in Ordnung sein:

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

Übrigens ist die Verwendung der Dienstprogrammmethode Arrays recht gut und macht den Code elegant.

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

   for (int i=0;i<arr3.length;i++) 
   {
   common[i]=(String)arr3[i];
  }
Amit Kumar Sagar
quelle
1

Sie können den Typkonverter verwenden . Um ein Array eines beliebigen Typs in ein Array von Zeichenfolgen zu konvertieren, können Sie Ihren eigenen Konverter registrieren:

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

und benutze es

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

Einfach ohne Kopf ändern Ändern Sie ein Objektarray in ein Zeichenfolgenarray. Objekt drivex [] = {1,2};

    for(int i=0; i<drive.length ; i++)
        {
            Str[i]= drivex[i].toString();
            System.out.println(Str[i]); 
        }
Rahul Chhangani
quelle