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

Eddy Freeman
sumber
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
ObscureRobot
sumber
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.

AlexR
sumber
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.

Brian Roach
sumber
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]);
Erhan Bagdemir
sumber
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) .

Alexander Savin
sumber
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).

majurageerthan
sumber
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

satish
sumber
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]);
       }
   }    

}
Vipin Menon
sumber
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 );

stacker
sumber