Dari Arraylist ke Array


111

Saya ingin tahu apakah aman / disarankan untuk mengonversi dari ArrayList ke Array? Saya memiliki file teks dengan setiap baris berupa string:

1236
1233
4566
4568
....

Saya ingin membacanya menjadi daftar array dan kemudian mengubahnya menjadi Array. Apakah itu dianjurkan / legal untuk melakukan itu?

Terima kasih


8
Anda bisa , tetapi Anda belum memberikan kami informasi hampir cukup untuk memberitahu Anda apakah itu ide yang baik atau tidak.
Jon Skeet

6
ArrayLists baik-baik saja. Satu-satunya alasan saya dapat melihat untuk mengonversi ke Array adalah jika Anda perlu memanggil metode yang membutuhkannya.
mike jones

Jawaban:


214

Ya itu aman untuk mengkonversi ArrayListkeArray . Apakah itu ide yang bagus tergantung pada tujuan penggunaan Anda. Apakah Anda memerlukan operasi yang ArrayListmenyediakan? Jika demikian, pertahankan ArrayList. Lain konversi pergi!

ArrayList<Integer> foo = new ArrayList<Integer>();
foo.add(1);
foo.add(1);
foo.add(2);
foo.add(3);
foo.add(5);
Integer[] bar = foo.toArray(new Integer[foo.size()]);
System.out.println("bar.length = " + bar.length);

keluaran

bar.length = 5

Bagaimana jika ArrayList kosong?
ThanosFisherman

48
Lalu kosong.
IMustBeSomeone

1
The method toArray(T[]) in the type ArrayList<Character> is not applicable for the arguments (char[])
Aaron Franke

75

Ini adalah cara terbaik (IMHO).

List<String> myArrayList = new ArrayList<String>();
//.....
String[] myArray = myArrayList.toArray(new String[myArrayList.size()]);

Kode ini juga berfungsi:

String[] myArray = myArrayList.toArray(new String[0]);

Tetapi kurang efektif: array string dibuat dua kali: pertama kali array panjang-nol dibuat, kemudian array ukuran sebenarnya dibuat, diisi, dan dikembalikan. Jadi, jika karena Anda mengetahui ukuran yang dibutuhkan (dari list.size()) Anda harus membuat array yang cukup besar untuk meletakkan semua elemen. Dalam hal ini tidak dialokasikan kembali.


4
penjelasan yang baik tentang perbedaan antara new String[0]dannew String[size]
gamliela

4
new String[0]sebenarnya lebih efisien. shipilev.net/blog/2016/arrays-wisdom-ancients
Radiodef

5
ArrayList<String> myArrayList = new ArrayList<String>();
...
String[] myArray = myArrayList.toArray(new String[0]);

Apakah itu "ide bagus" akan sangat bergantung pada kasus penggunaan Anda.


terima kasih, hanya ingin tahu: saya tidak perlu mendeklarasikan ukuran array?
Eddy Freeman

JavaDocs adalah teman Anda. Jika array yang diteruskan terlalu kecil, array baru dikembalikan. Versi lain dari metode yang tidak memerlukan argumen mengembalikan larikObject
Brian Roach

3

dengan asumsi v adalah ArrayList:

String[] x = (String[]) v.toArray(new String[0]);

1

Ada dua gaya untuk mengonversi koleksi menjadi larik: baik menggunakan larik berukuran sebelumnya (seperti c.toArray(new String[c.size()])) atau menggunakan larik kosong (seperti c.toArray(new String[0])). Dalam versi Java yang lebih lama disarankan menggunakan larik berukuran sebelumnya, karena panggilan refleksi yang diperlukan untuk membuat larik dengan ukuran yang sesuai cukup lambat. Akan tetapi, sejak update terakhir OpenJDK 6 , panggilan ini telah diterapkan, membuat performa versi array kosong menjadi sama dan terkadang bahkan lebih baik, dibandingkan dengan versi yang berukuran sebelumnya. Juga meneruskan larik berukuran sebelumnya berbahaya untuk koleksi serentak atau tersinkronisasi karena balapan data dimungkinkan antara ukuran dan panggilan toArray yang dapat menghasilkan null tambahan di akhir larik, jika koleksi secara bersamaan menyusut selama operasi. Anda bisa mengikuti gaya seragam:baik menggunakan larik kosong (yang direkomendasikan di Java modern) atau menggunakan larik berukuran sebelumnya (yang mungkin lebih cepat di versi Java yang lebih lama atau JVM berbasis non-HotSpot) .


1

Ini adalah penggunaan yang disarankan untuk Java yang lebih baru (> Java 6)

String[] myArray = myArrayList.toArray(new String[0]);

Dalam versi Java yang lebih lama disarankan menggunakan larik berukuran sebelumnya, karena panggilan refleksi yang diperlukan untuk membuat larik dengan ukuran yang sesuai cukup lambat. Akan tetapi, sejak update terakhir OpenJDK 6, panggilan ini telah diterapkan, membuat performa versi array kosong menjadi sama dan terkadang bahkan lebih baik, dibandingkan dengan versi yang berukuran sebelumnya. Juga meneruskan larik berukuran sebelumnya berbahaya untuk koleksi serentak atau tersinkronisasi karena balapan data dimungkinkan antara ukuran dan panggilan toArray yang dapat menghasilkan null tambahan di akhir larik, jika koleksi itu secara bersamaan menyusut selama operasi. Pemeriksaan ini memungkinkan untuk mengikuti gaya seragam: baik menggunakan larik kosong (yang direkomendasikan di Java modern) atau menggunakan larik berukuran sebelumnya (yang mungkin lebih cepat di versi Java yang lebih lama atau JVM berbasis non-HotSpot).


0

Antarmuka Collection menyertakan metode toArray () untuk mengubah koleksi baru menjadi array. Ada dua bentuk metode ini. Versi tanpa argumen akan mengembalikan elemen koleksi dalam array Object: public Object [] toArray (). Array yang dikembalikan tidak dapat mentransmisikan ke tipe data lain. Ini adalah versi paling sederhana. Versi kedua mengharuskan Anda untuk memasukkan tipe data dari larik yang ingin Anda kembalikan: public Object [] toArray (Object type []).

 public static void main(String[] args) {  
           List<String> l=new ArrayList<String>();  
           l.add("A");  
           l.add("B");  
           l.add("C");  
           Object arr[]=l.toArray();  
           for(Object a:arr)  
           {  
                String str=(String)a;  
                System.out.println(str);  
           }  
      }  

untuk referensi, lihat tautan ini http://techno-terminal.blogspot.in/2015/11/how-to-obtain-array-from-arraylist.html


0

Salah satu pendekatannya adalah menambahkan Second for Loop di mana pencetakan dilakukan di dalam loop for pertama. Seperti ini:

static String[] SENTENCE; 

public static void main(String []args) throws Exception{

   Scanner sentence = new Scanner(new File("assets/blah.txt"));
   ArrayList<String> sentenceList = new ArrayList<String>();

   while (sentence.hasNextLine())
   {
       sentenceList.add(sentence.nextLine());
   }

   sentence.close();

   String[] sentenceArray = sentenceList.toArray(new String[sentenceList.size()]);
  // System.out.println(sentenceArray.length);
   for (int r=0;r<sentenceArray.length;r++)
   {
       SENTENCE = sentenceArray[r].split("(?<=[.!?])\\s*"); //split sentences and store in array 

       for (int i=0;i<SENTENCE.length;i++)
       {
           System.out.println("Sentence " + (i+1) + ": " + SENTENCE[i]);
       }
   }    

}

0
ArrayList<String> a = new ArrayList<String>();
a.add( "test" );
@SuppressWarnings( "unused")
Object[] array = a.toArray();

Itu tergantung pada apa yang ingin Anda capai jika Anda perlu memanipulasi array nanti, itu akan membutuhkan lebih banyak usaha daripada menyimpan string di ArrayList. Anda juga memiliki akses acak dengan ArrayList olehlist.get( index );

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.