Yanıtlar:
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 .
Class
iç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.
Java 8'de bir alternatif:
String[] strings = list.stream().toArray(String[]::new);
Java 11+:
String[] strings = list.toArray(String[]::new);
toArray
bir Stream
nesnede kullanabilirsiniz . Bu derleme hatası, akışı kullanarak a azaltırsanız Collectors
ve sonra uygulamayı denerseniz oluşabilir toArray
.
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!
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.
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
Java 8'de:
String[] strings = list.parallelStream().toArray(String[]::new);
parallelStream()
sadece yerine stream()
?
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);
List <String> list = ...
String[] array = new String[list.size()];
int i=0;
for(String s: list){
array[i++] = s;
}
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()));
}
}
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.
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 .
.toString()
açık bir oyuncuya ihtiyaç duyulmayacak yerlerde kullanma , 3. artım bile yapmıyorsunuz i
ve 4. while
daha 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(); }
Java 11'de Collection.toArray(generator)
yöntemi kullanabiliriz . Aşağıdaki kod yeni bir dize dizisi oluşturur:
List<String> list = List.of("one", "two", "three");
String[] array = list.toArray(String[]::new)
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);
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]);
}
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;
}
toArray(T[])
ve sözdizimi benzerStream.toArray
.