Java'da 'ArrayList <String> öğesini' String [] 'ye dönüştürme


1023

Bir ArrayList<String>nesneyi String[]Java'daki bir diziye nasıl dönüştürebilirim ?


2
Var bu cevabı yapılmış olan güncelleştirilmiş bir yaklaşımla JDK-11 için yeni bir eşit derecede ölçülebilir API tanıtan toArray(T[])ve sözdizimi benzer Stream.toArray.
Naman

Yanıtlar:


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

Örneğin:

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

toArray()Herhangi bir bağımsız değişken döner geçmeksizin bir yöntem Object[]. Bu nedenle, bir diziyi listeden verilerle doldurulacak ve döndürülecek bir argüman olarak geçirmeniz gerekir. Boş bir diziyi de geçirebilirsiniz, ancak istediğiniz boyuta sahip bir diziyi de geçirebilirsiniz.

Önemli güncelleme : Başlangıçta yukarıdaki kod kullanılır new String[list.size()]. Ancak, bu blog yazısı JVM optimizasyonları nedeniyle new String[0]kullanımın şimdi daha iyi olduğunu ortaya koymaktadır .


16
Argümanın büyüklüğü herhangi bir fark yaratıyor mu?
Thorbjørn Ravn Andersen

37
Bir kez daha dizi instnatiation kaydeder
Bozho

59
Sıfır uzunluklu bir dizi sağlamak, onu oluşturmak ve atmak bile ortalama olarak doğru boyutta bir dizi ayırmaktan daha hızlıdır. Kıyaslamalar ve açıklama için buraya bakınız: shipilev.net/blog/2016/arrays-wisdom-ancients
Stuart Marks

2
(Üzgünüm. Retorik soru. Cevap, elbette, Java gerçek jenerikler yapmaz çünkü çoğunlukla sadece Object'i dökerek taklit eder)
Nyerguds

3
@lyuboslavkanev Sorun Java'da genel türün olması, bu türe dayalı nesneler oluşturmak için yeterli olmamasıdır; bir dizi bile (bu saçma, çünkü bu herhangi bir tür için çalışması gerekir ). Onunla yapılabilecek her şey, görebildiğim kadarıyla döküm. Aslında, türden nesneler bile oluşturmak Classiçin, genel türden türetmek tamamen imkansız gibi görünen gerçek nesneye sahip olmanız gerekir . Bunun nedeni, dediğim gibi, tüm yapının sahte olması; bunların hepsi dahili olarak Object olarak saklanır.
Nyerguds

170

Java 8'de bir alternatif:

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

Java 11+:

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

25
Veya herhangi bir faydası var mı?
James Watkins

1
Bu sözdizimini tercih ederim, ancak IntelliJ bununla bir derleyici hatası görüntüler, "T [] işlevsel bir arabirim değildir" diye şikayet eder.
Glen Mazza

3
@GlenMazza sadece toArraybir Streamnesnede kullanabilirsiniz . Bu derleme hatası, akışı kullanarak a azaltırsanız Collectorsve sonra uygulamayı denerseniz oluşabilir toArray.
Udara Bentota

39

toArray()Yöntemi aşağıdakiler için kullanabilirsiniz List:

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

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

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

Veya öğeleri bir diziye manuel olarak ekleyebilirsiniz:

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

Bu yardımcı olur umarım!


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

CopyOf kullanılarak, dizilere ArrayList de yapılabilir.


4
Deve önerin "objectList = ..." ve "stringArray" olmasını önerin. Ayrıca, Arrays.copyOf ... başkenti O.
Jason Weden

1
list.toArray () dahili olarak Arrays.copyOf () kullanır
David

25

Java-11'den başlayarak, alternatif olarak Collection.toArray(IntFunction<T[]> generator)aşağıdakileri elde etmek için API'yi kullanabilirsiniz :

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

10

Java 8'de:

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

12
Bu gerçekten bu cevapta zaten var . Belki de bu cevaba tamamen yeni bir cevap olarak bir düzenleme olarak ekleyin.
Nehir

11
Neden parallelStream()sadece yerine stream()?
Yoory N.

7

Java 8'de,

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

6

Jenerik çözümü herhangi dönüştürürken List<Type>için 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;
}

Notoverride toString() Yöntem gerekir .

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

5
List <String> list = ...
String[] array = new String[list.size()];
int i=0;
for(String s: list){
  array[i++] = s;
}

13
Bu çalışır, ancak süper verimli değildir ve kabul edilen yanıtta ekstra kodla işlevselliği çoğaltır.
Alan Delimon

5

kullanıcının bir işlev istediği verilerin fazladan manipülasyonu isteniyorsa, bu yaklaşım mükemmel değildir (öğenin sınıfını ikinci parametre olarak geçirmeyi gerektirdiği için), ancak çalışır:

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

5

Uygulamanız zaten Apache Commons lib kullanıyorsa, her seferinde yeni bir boş dizi oluşturmamak için kabul edilen cevabı biraz değiştirebilirsiniz:

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

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

İçinde farklı tiplerde birkaç önceden yerleştirilmiş boş dizi vardır ArrayUtils.

Ayrıca JVM'yi bizim için bu şekilde boş bir dizi oluşturmak için kandırabiliriz:

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

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

Ama bu şekilde gerçekten bir avantajı yok, sadece bir zevk meselesi, IMO.


5

Aşağıdakilerin Iterator<String>öğelerini yinelemek için kullanabilirsiniz 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();
}

Artık öğeleri String[]herhangi bir Döngü kullanmaktan kurtarabilirsiniz .


Aşağı düştüm çünkü: 1. Sizi zorlayan jeneriklerin kullanımı yok 2. .toString()açık bir oyuncuya ihtiyaç duyulmayacak yerlerde kullanma , 3. artım bile yapmıyorsunuz ive 4. whiledaha iyi bir a ile değiştirilecek for. Önerilen kod: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

Tamam, şimdi anladım. Teşekkürler.
Vatsal Chavda

İdeal olarak, kodunuzu bu yorumları içerecek şekilde düzenlemelisiniz (yani ... cevabınız için iyi olduklarını düşünüyorsanız!). Kod değişmeden kalırken benim downvote kaldırmayı düşünmeyeceğim.
Olivier Grégoire

Burada yeniyim, bu yüzden işlerin burada nasıl çalıştığını henüz bilmiyorum. Rağmen, yardım arkadaşı teşekkür ederiz.
Vatsal Chavda

Bu daha iyi! Sadece biraz düzenledim, ama nasıl çalıştığını deneyimlediniz: cevap verin, geliştirin, defne alın;)
Olivier Grégoire


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

Yorum başına, dönüşümün nasıl çalıştığını açıklamak için bir paragraf ekledim. İlk olarak, Liste bir String akışına dönüştürülür. Daha sonra akıştaki öğeleri Diziye dönüştürmek için Stream.toArray öğesini kullanır. Yukarıdaki son ifadede "size -> new String [size]" aslında String akışının boyutu ile bir String dizisi ayıran bir IntFunction işlevidir. İfade,

IntFunction<String []> allocateFunc = size -> { 
return new String[size];
};   
String [] strArry= list.stream().toArray(allocateFunc);

4
Bu cevap ne katıyor? Soruyu neden yanıtladığını açıklamaksızın diğer cevapları tekrarlıyor gibi görünüyor.
Richard

2

Listeyi şu yöntemi kullanarak String dizisine dönüştürebilirsiniz:

 Object[] stringlist=list.toArray();

Tüm örnek:

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

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.