Konversi 'ArrayList <String> ke' String [] 'di Jawa

1025

Bagaimana saya bisa mengkonversi ArrayList<String>objek ke String[]array di Jawa?

Alex
sumber
2
Telah membuat jawaban ini dengan pendekatan yang diperbarui dengan JDK-11 yang memperkenalkan API baru dengan kinerja yang sama toArray(T[])dan serupa dalam sintaksisnya Stream.toArray.
Naman

Jawaban:

1791
List<String> list = ..;
String[] array = list.toArray(new String[0]);

Sebagai contoh:

List<String> list = new ArrayList<String>();
//add some stuff
list.add("android");
list.add("apple");
String[] stringArray = list.toArray(new String[0]);

The toArray()Metode tanpa melewati setiap argumen kembali Object[]. Jadi, Anda harus melewatkan array sebagai argumen, yang akan diisi dengan data dari daftar, dan dikembalikan. Anda dapat melewatkan array kosong juga, tetapi Anda juga dapat melewatkan array dengan ukuran yang diinginkan.

Pembaruan penting : Awalnya kode di atas digunakan new String[list.size()]. Namun, blogpost ini mengungkapkan bahwa karena optimasi JVM, menggunakan new String[0]lebih baik sekarang.

Bozho
sumber
16
Apakah ukuran argumen membuat perbedaan?
Thorbjørn Ravn Andersen
37
menghemat satu lagi instargeation array
Bozho
59
Ternyata menyediakan array panjang nol, bahkan membuat dan membuangnya, rata-rata lebih cepat daripada mengalokasikan array dengan ukuran yang tepat. Untuk tolok ukur dan penjelasan, lihat di sini: shipilev.net/blog/2016/arrays-wisdom-ancients
Stuart Marks
2
(Maaf. Pertanyaan retoris. Jawabannya, tentu saja, karena Java tidak melakukan generik nyata; sebagian besar hanya memalsukan mereka dengan melemparkan Object)
Nyerguds
3
@lyuboslavkanev Masalahnya adalah memiliki tipe generik di Java tidak cukup untuk benar-benar membuat objek berdasarkan tipe itu; bahkan bukan array (yang konyol, karena itu harus bekerja untuk semua jenis). Yang bisa dilakukan dengan itu, sejauh yang saya bisa lihat, adalah casting. Bahkan, untuk bahkan membuat objek dari tipe, Anda harus memiliki Classobjek yang sebenarnya , yang tampaknya sama sekali tidak mungkin untuk diturunkan dari tipe generik. Alasan untuk ini, seperti yang saya katakan, adalah bahwa seluruh konstruksi palsu; itu semua hanya disimpan sebagai Object secara internal.
Nyerguds
170

Alternatif di Java 8:

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

Java 11+:

String[] strings = list.toArray(String[]::new);
Vitalii Fedorenko
sumber
25
Atau manfaatnya?
James Watkins
1
Saya lebih suka sintaks itu, tetapi IntelliJ menampilkan kesalahan kompiler dengan itu, mengeluh "T [] bukan antarmuka fungsional."
Glen Mazza
3
@GlenMazza hanya dapat Anda gunakan toArraypada Streamobjek. Kesalahan kompilasi ini dapat terjadi jika Anda mengurangi aliran menggunakan Collectorsdan kemudian mencoba menerapkan toArray.
Udara Bentota
39

Anda dapat menggunakan toArray()metode ini untuk List:

ArrayList<String> list = new ArrayList<String>();

list.add("apple");
list.add("banana");

String[] array = list.toArray(new String[list.size()]);

Atau Anda dapat secara manual menambahkan elemen ke array:

ArrayList<String> list = new ArrayList<String>();

list.add("apple");
list.add("banana");

String[] array = new String[list.size()];

for (int i = 0; i < list.size(); i++) {
    array[i] = list.get(i);
}

Semoga ini membantu!

codecubed
sumber
30
ArrayList<String> arrayList = new ArrayList<String>();
Object[] objectList = arrayList.toArray();
String[] stringArray =  Arrays.copyOf(objectList,objectList.length,String[].class);

Menggunakan copyOf, ArrayList ke array mungkin juga dilakukan.

Rajesh Vemula
sumber
4
Sarankan camelcase jadi "objectList = ..." dan "stringArray". Juga, itu adalah Arrays.copyOf ... capital O.
Jason Weden
1
list.toArray () secara internal menggunakan Arrays.copyOf ()
David
25

Mulai dari Java-11, seseorang dapat menggunakan API sebagai alternatif Collection.toArray(IntFunction<T[]> generator)untuk mencapai hal yang sama seperti:

List<String> list = List.of("x","y","z");
String[] arrayBeforeJDK11 = list.toArray(new String[0]);
String[] arrayAfterJDK11 = list.toArray(String[]::new); // similar to Stream.toArray
Naman
sumber
10

Di Jawa 8:

String[] strings = list.parallelStream().toArray(String[]::new);
Mike Shauneu
sumber
12
Ini benar-benar sudah terkandung dalam jawaban ini . Mungkin menambahkannya sebagai edit untuk jawaban itu dan bukan sebagai yang sama sekali baru.
Sungai
11
Mengapa parallelStream()bukannya sederhana stream()?
Yoory N.
7

Di Java 8, itu bisa dilakukan menggunakan

String[] arrayFromList = fromlist.stream().toArray(String[]::new);
KayV
sumber
6

Generik solusi untuk rahasia setiap List<Type>ke String []:

public static  <T> String[] listToArray(List<T> list) {
    String [] array = new String[list.size()];
    for (int i = 0; i < array.length; i++)
        array[i] = list.get(i).toString();
    return array;
}

Catatan Anda harus override toString()metode.

class Car {
  private String name;
  public Car(String name) {
    this.name = name;
  }
  public String toString() {
    return name;
  }
}
final List<Car> carList = new ArrayList<Car>();
carList.add(new Car("BMW"))
carList.add(new Car("Mercedes"))
carList.add(new Car("Skoda"))
final String[] carArray = listToArray(carList);
Khaled Lela
sumber
5
List <String> list = ...
String[] array = new String[list.size()];
int i=0;
for(String s: list){
  array[i++] = s;
}
HZhang
sumber
13
Ini berfungsi, tetapi tidak super efisien, dan fungsi duplikat dalam jawaban yang diterima dengan kode tambahan.
Alan Delimon
5

dalam hal beberapa manipulasi ekstra dari data yang diinginkan, di mana pengguna menginginkan suatu fungsi, pendekatan ini tidak sempurna (karena membutuhkan melewati kelas elemen sebagai parameter kedua), tetapi berfungsi:

import java.util.ArrayList; import java.lang.reflect.Array;

public class Test {
  public static void main(String[] args) {
    ArrayList<Integer> al = new ArrayList<>();
    al.add(1);
    al.add(2);
    Integer[] arr = convert(al, Integer.class);
    for (int i=0; i<arr.length; i++)
      System.out.println(arr[i]);
  }

  public static <T> T[] convert(ArrayList<T> al, Class clazz) {
    return (T[]) al.toArray((T[])Array.newInstance(clazz, al.size()));
  }
}
Roberto Attias
sumber
5

Jika aplikasi Anda sudah menggunakan lib Apache Commons, Anda dapat sedikit memodifikasi jawaban yang diterima untuk tidak membuat array kosong baru setiap kali:

List<String> list = ..;
String[] array = list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);

// or if using static import
String[] array = list.toArray(EMPTY_STRING_ARRAY);

Ada beberapa array kosong yang telah dialokasikan sebelumnya dari berbagai jenis di ArrayUtils.

Kita juga bisa menipu JVM untuk membuat array kosong untuk kita dengan cara ini:

String[] array = list.toArray(ArrayUtils.toArray());

// or if using static import
String[] array = list.toArray(toArray());

Tapi benar-benar tidak ada keuntungan dengan cara ini, hanya masalah selera, IMO.

Yoory N.
sumber
5

Anda dapat menggunakan Iterator<String>untuk mengulangi elemen-elemen dari ArrayList<String>:

ArrayList<String> list = new ArrayList<>();
String[] array = new String[list.size()];
int i = 0;
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); i++) {
    array[i] = iterator.next();
}

Sekarang Anda dapat mengambil kembali elemen dari String[]menggunakan Loop apa pun.

Vatsal Chavda
sumber
Saya menurunkan suara karena: 1. tidak ada penggunaan obat generik yang memaksa Anda 2. menggunakan di .toString()mana tidak ada pemeran eksplisit yang diperlukan, 3. Anda bahkan tidak menambah i, dan 4. whileakan lebih baik digantikan oleh a for. Kode yang disarankan:ArrayList<String> stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator<String> it = stringList.iterator(); it.hasNext(); i++) { stringArray[i] = it.next(); }
Olivier Grégoire
Oke, saya mengerti sekarang. Terima kasih.
Vatsal Chavda
Yah, idealnya, Anda harus mengedit kode Anda untuk memasukkan komentar-komentar itu (yaitu ... jika Anda pikir itu bagus untuk jawaban Anda!). Saya tidak akan mempertimbangkan menghapus downvote saya sementara kode tetap tidak berubah.
Olivier Grégoire
Saya baru di sini, jadi saya belum tahu bagaimana cara kerjanya di sini. Meskipun, hargai bantuan teman Anda.
Vatsal Chavda
Ini jauh lebih baik! Saya telah mengedit sedikit, tetapi Anda baru saja mengalami bagaimana cara kerjanya: memberikan jawaban, meningkatkannya, dapatkan kemenangan;)
Olivier Grégoire
5

Di Java 11, kita bisa menggunakan Collection.toArray(generator)metode ini. Kode berikut akan membuat array string baru:

List<String> list = List.of("one", "two", "three");
String[] array = list.toArray(String[]::new)

dari java.base's java.util.Collection.toArray() .

Rafal Borowiec
sumber
4
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    String [] strArry= list.stream().toArray(size -> new String[size]);

Per komentar, saya telah menambahkan paragraf untuk menjelaskan cara kerja konversi. Pertama, Daftar dikonversi ke aliran String. Kemudian ia menggunakan Stream.toArray untuk mengonversi elemen dalam aliran ke Array. Dalam pernyataan terakhir di atas "size -> new String [size]" sebenarnya adalah fungsi IntFunction yang mengalokasikan array String dengan ukuran stream String. Pernyataan itu identik dengan

IntFunction<String []> allocateFunc = size -> { 
return new String[size];
};   
String [] strArry= list.stream().toArray(allocateFunc);
nick w.
sumber
4
Nilai apa yang ditambahkan jawaban ini? Tampaknya hanya mengulangi jawaban lain tanpa menjelaskan mengapa itu menjawab pertanyaan.
Richard
2

Anda dapat mengonversi array Daftar ke String dengan menggunakan metode ini:

 Object[] stringlist=list.toArray();

Contoh lengkap:

ArrayList<String> list=new ArrayList<>();
    list.add("Abc");
    list.add("xyz");

    Object[] stringlist=list.toArray();

    for(int i = 0; i < stringlist.length ; i++)
    {
          Log.wtf("list data:",(String)stringlist[i]);
    }
Panchal Nilkanth
sumber
1
private String[] prepareDeliveryArray(List<DeliveryServiceModel> deliveryServices) {
    String[] delivery = new String[deliveryServices.size()];
    for (int i = 0; i < deliveryServices.size(); i++) {
        delivery[i] = deliveryServices.get(i).getName();
    }
    return delivery;
}
Denis Fedak
sumber