Bagaimana mengkonversi array objek ke array string di Jawa

244

Saya menggunakan kode berikut untuk mengubah array objek ke array 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();

Tetapi saya bertanya-tanya apakah ada cara lain untuk melakukan ini, sesuatu seperti:

String_Array=(String[])Object_Array;

Tetapi ini akan menyebabkan kesalahan runtime: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

Apa cara yang benar untuk melakukannya?

jujur
sumber
3
Saya suka jawaban waxwing yang terbaik: String [] stringArray = Arrays.copyOf (objectArray, objectArray.length, String []. Class); Sangat ringkas dan berhasil. Saya menghitung berapa banyak waktu yang diperlukan untuk jawaban dan pendekatan saya saat ini, semuanya hampir sama.
Frank

Jawaban:

381

Alternatif lain untuk System.arraycopy:

String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);
waxwing
sumber
59
hanya di Jawa 1.6 dan di atas
newacct
10
Hrm Saya tidak bisa membuat yang ini berfungsi, di mana contoh bentuk panjang dalam pertanyaan awal tidak bekerja. Itu melempar java.lang.ArrayStoreException. Saya mendapatkan array objek dari metode toArray pada ArrayList generik yang berisi tipe kustom saya. Apakah ini tidak diharapkan bekerja dengan obat generik atau semacamnya?
Ian Varley
4
@Ian, masalahnya adalah objectArray berisi Objects not Strings (lihat komentar saya pada jawaban saya yang menderita masalah yang sama).
Yishai
3
Saya baru saja mencoba pendekatan ini dan, setidaknya dalam kasus saya, saya menemukan bahwa kinerja tidak sebaik membangun array sendiri dengan mengulangi. (Sayang sekali, saya menyukainya sebagai one-liner!)
mdup
1
@ mdup - satu kapal yang cukup panjang. bungkus dengan metode mungkin.
MasterJoe2
72

Di Jawa 8:

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

Untuk mengonversi array jenis lain:

String[] strings = Arrays.stream(obj).map(Object::toString).
                   toArray(String[]::new);
Vitalii Fedorenko
sumber
2
Ini adalah karya yang indah dan memenuhi persyaratan untuk dapat secara estetika mengubah array objek non-String ke array toString yang setara. Jawaban yang saat ini diterima tidak mencapai ini.
b4n4n4p4nd4
Ini berfungsi tetapi jika daftar Anda mengandung nol Anda akan mendapatkan NullPointerException. Untuk mengatasi masalah itu, lihat: stackoverflow.com/questions/4581407/…
Tony Falabella
61

System.arraycopy mungkin cara yang paling efisien, tetapi untuk estetika, saya lebih suka:

 Arrays.asList(Object_Array).toArray(new String[Object_Array.length]);
Yishai
sumber
10
Itu hanya berfungsi jika objek semuanya adalah String; kode saat ini berfungsi bahkan jika tidak.
Michael Myers
Poin yang bagus. Saya memahami toString hanya sebagai cara casting ke String, bukan maksud untuk benar-benar mengganti objek dengan sesuatu yang lain. Jika itu yang perlu Anda lakukan, maka perulangan adalah satu-satunya cara.
Yishai
ini tidak berfungsi di Android 2.3.3 .. itu memberi saya kesalahan mengatakan bahwa metode copyof tidak didefinisikan. Saya mengimpor semua file yang tepat (ctrl + shift + I) .. tetapi masih tidak berfungsi.
user590849
3
@ user590849, jawaban saya tidak digunakan copyof. Apakah Anda merujuk ke jawaban lain?
Yishai
50

Saya melihat bahwa beberapa solusi telah disediakan tetapi tidak ada sebab-sebab, jadi saya akan menjelaskan ini secara terperinci karena saya percaya penting untuk mengetahui kesalahan apa yang Anda lakukan hanya untuk mendapatkan "sesuatu" yang bekerja dari balasan yang diberikan.

Pertama, mari kita lihat apa yang dikatakan 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.

Ini mungkin tidak terlihat penting tetapi seperti yang Anda lihat ... Jadi, apa yang gagal dilakukan oleh baris berikut? Semua objek dalam daftar adalah String tetapi tidak mengubahnya, mengapa?

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

Mungkin, banyak dari Anda akan berpikir bahwa kode ini melakukan hal yang sama, tetapi tidak.

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

Padahal pada kenyataannya kode tertulis melakukan sesuatu seperti ini. Javadoc mengatakannya! Ini akan membuat array baru, apa itu akan menjadi Objek !!!

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

Jadi tList.toArray adalah instantiating Objects dan bukan Strings ...

Oleh karena itu, solusi alami yang belum disebutkan di utas ini, tetapi itulah yang direkomendasikan Oracle sebagai berikut

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

Semoga cukup jelas.

Capagris
sumber
Dari segi kinerja koreksi, String tArray [] = tList.toArray (String baru [tList.size ()])); Kalau tidak, array harus diubah ukurannya lagi ...
Lonzak
1
Penjelasan yang bagus. Hanya satu hal lagi, jika konsumsi memori atau kinerja adalah masalah, jangan menduplikasi array. Baik melemparkan elemen dalam String kapan pun Anda membutuhkannya (String)Object_Array[i]atau Object_Array[i].toString()atau mengalokasikan array sebagai array String Object Object_Array[]=new String[100];... dapatkan nilai ... lalu cor String_Array=(String[])Object_Arrayyang sekarang berfungsi.
Solostaran14
1
ini melempar ArrayStoreException
iltaf khalid
7

Kerangka kerja koleksi google menawarkan penawaran metode transformasi yang baik, sehingga Anda dapat mengubah Objek Anda menjadi Strings. Satu-satunya downside adalah bahwa itu harus dari Iterable ke Iterable tetapi ini adalah cara saya akan melakukannya:

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

Ini membawa Anda jauh dari menggunakan array, tapi saya pikir ini akan menjadi cara yang saya sukai.

Richard
sumber
1
@Yishai: tidak, array tidak mengimplementasikan Iterable. iterasi atas mereka secara khusus didefinisikan dalam JLS
newacct
@newacct, cukup benar, maksud saya array dapat dengan mudah dibungkus dalam Iterable (Arrays.asList ()). Saya tidak tahu mengapa itu keluar seperti itu.
Yishai
5

Jika Anda ingin mendapatkan representasi String dari objek dalam array Anda, maka ya, tidak ada cara lain untuk melakukannya.

Jika Anda tahu array Obyek Anda hanya berisi Strings, Anda juga dapat melakukan (instread memanggil toString ()):

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

Satu-satunya kasus ketika Anda bisa menggunakan cast ke String [] dari Object_Array adalah jika array yang dirujuknya akan benar-benar didefinisikan sebagai String [], misalnya ini akan bekerja:

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

Yang ini bagus, tetapi tidak berfungsi seperti yang saya perhatikan, karena tanda kurung:

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

Yang ini jelek tapi berfungsi:

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

Jika Anda menggunakan kode ini, Anda harus yakin bahwa string yang dikembalikan oleh toString () objek Anda tidak mengandung koma.

Ilya Boyandin
sumber
1
Saran yang menarik, tetapi Anda harus terlebih dahulu menghapus [dan] pada elemen pertama dan terakhir.
Michael Myers
1
cantik sampai melakukan pekerjaan :)
AZ_
2
Ini tidak berfungsi jika String berisi koma (,)
Andreas Berger
2

Untuk ide Anda, sebenarnya Anda sedang mendekati kesuksesan, tetapi jika Anda memang suka ini, boleh saja:

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

BTW, menggunakan metode utilitas Array cukup baik dan membuat kode elegan.

ttt
sumber
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
sumber
1

Kamu bisa memakai tipe-konverter . Untuk mengonversi array jenis apa pun ke array string, Anda dapat mendaftarkan konverter Anda sendiri:

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

dan gunakan itu

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

Mudah berubah tanpa headche apapun Konversi array objek apa pun menjadi string array Object drivex [] = {1,2};

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