Odpowiedzi:
List<String> list = ..;
String[] array = list.toArray(new String[0]);
Na przykład:
List<String> list = new ArrayList<String>();
//add some stuff
list.add("android");
list.add("apple");
String[] stringArray = list.toArray(new String[0]);
toArray()
Metoda nie przechodząc żadnych zwrotów argumentów Object[]
. Musisz więc przekazać tablicę jako argument, który zostanie wypełniony danymi z listy i zwrócony. Możesz również przekazać pustą tablicę, ale możesz również przekazać tablicę o pożądanym rozmiarze.
Ważna aktualizacja : pierwotnie użyty powyższy kod new String[list.size()]
. Jednak ten blog pokazuje, że ze względu na optymalizację JVM korzystanie z niego new String[0]
jest teraz lepsze.
Class
obiekt, który wydaje się całkowicie niemożliwy do uzyskania na podstawie typu ogólnego. Powodem tego, jak powiedziałem, jest to, że cała konstrukcja jest fałszywa; wszystko jest po prostu przechowywane wewnętrznie jako Obiekt.
Alternatywa w Javie 8:
String[] strings = list.stream().toArray(String[]::new);
Java 11+:
String[] strings = list.toArray(String[]::new);
toArray
na Stream
obiekcie. Ten błąd kompilacji może wystąpić, jeśli zmniejszysz strumień za pomocą a, Collectors
a następnie spróbujesz zastosować toArray
.
Możesz użyć tej toArray()
metody do List
:
ArrayList<String> list = new ArrayList<String>();
list.add("apple");
list.add("banana");
String[] array = list.toArray(new String[list.size()]);
Lub możesz ręcznie dodać elementy do tablicy:
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);
}
Mam nadzieję że to pomoże!
ArrayList<String> arrayList = new ArrayList<String>();
Object[] objectList = arrayList.toArray();
String[] stringArray = Arrays.copyOf(objectList,objectList.length,String[].class);
Używanie copyOf, ArrayList do tablic może być również wykonane.
Począwszy od Java-11, można alternatywnie użyć interfejsu API, Collection.toArray(IntFunction<T[]> generator)
aby osiągnąć to samo, co:
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
W Javie 8:
String[] strings = list.parallelStream().toArray(String[]::new);
parallelStream()
zamiast po prostu stream()
?
Leki generyczne rozwiązanie przekształca dowolny List<Type>
do 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;
}
Uwaga Musisz wykonać override toString()
metodę.
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;
}
w przypadku, gdy pożądana jest dodatkowa manipulacja danymi, dla której użytkownik chce funkcji, to podejście nie jest idealne (ponieważ wymaga przekazania klasy elementu jako drugiego parametru), ale działa:
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()));
}
}
Jeśli Twoja aplikacja korzysta już z biblioteki Apache Commons lib, możesz nieznacznie zmodyfikować zaakceptowaną odpowiedź, aby za każdym razem nie tworzyć nowej pustej tablicy:
List<String> list = ..;
String[] array = list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
// or if using static import
String[] array = list.toArray(EMPTY_STRING_ARRAY);
Istnieje jeszcze kilka wstępnie przydzielonych pustych tablic różnych typów ArrayUtils
.
Możemy również oszukać JVM, aby utworzył dla nas pustą tablicę w ten sposób:
String[] array = list.toArray(ArrayUtils.toArray());
// or if using static import
String[] array = list.toArray(toArray());
Ale tak naprawdę nie ma żadnej przewagi, tylko kwestia gustu, IMO.
Możesz użyć Iterator<String>
do iteracji elementów 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();
}
Teraz możesz wycofać elementy z String[]
użycia dowolnej pętli.
.toString()
gdzie nie byłoby konieczne użycie jawnej obsady, 3. nawet nie zwiększania i
, i 4. while
lepiej byłoby zastąpić przez for
. Sugerowany 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(); }
W Javie 11 możemy użyć tej Collection.toArray(generator)
metody. Poniższy kod utworzy nową tablicę ciągów:
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]);
Do komentarzy dodałem akapit wyjaśniający, jak działa konwersja. Po pierwsze, List jest konwertowany na strumień String. Następnie używa Stream.toArray do konwersji elementów w strumieniu na tablicę. W ostatniej instrukcji powyżej „size -> new String [size]” to tak naprawdę funkcja IntFunction, która przydziela tablicę String o rozmiarze strumienia String. Instrukcja jest identyczna z
IntFunction<String []> allocateFunc = size -> {
return new String[size];
};
String [] strArry= list.stream().toArray(allocateFunc);
Możesz przekonwertować List na tablicę String, używając tej metody:
Object[] stringlist=list.toArray();
Kompletny przykład:
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[])
i podobny w składniStream.toArray
.