Как преобразовать List
в Array
в Java?
Проверьте код ниже:
ArrayList<Tienda> tiendas;
List<Tienda> tiendasList;
tiendas = new ArrayList<Tienda>();
Resources res = this.getBaseContext().getResources();
XMLParser saxparser = new XMLParser(marca,res);
tiendasList = saxparser.parse(marca,res);
tiendas = tiendasList.toArray();
this.adaptador = new adaptadorMarca(this, R.layout.filamarca, tiendas);
setListAdapter(this.adaptador);
Мне нужно заполнить массив tiendas
значениями tiendasList
.
Или:
Foo[] array = list.toArray(new Foo[list.size()]);
или
Foo[] array = new Foo[list.size()];
list.toArray(array); // fill the array
Обратите внимание, что это работает только для массивов ссылочных типов. Для массивов примитивных типов используйте традиционный способ:
List<Integer> list = ...;
int[] array = new int[list.size()];
for(int i = 0; i < list.size(); i++) array[i] = list.get(i);
list.toArray(new Foo[0])
как это дает понять, что параметр передается только для информации о типе, а размер не имеет значения.
new Foo[0]
то вы создаете дополнительный бесполезный массив. Проверьте исходный код, чтобы проверить.
Альтернатива в Java 8:
String[] strings = list.stream().toArray(String[]::new);
Я думаю, что это самый простой способ:
Foo[] array = list.toArray(new Foo[0]);
If the list fits in the specified array, it is returned therein. Otherwise, a new array is allocated with the runtime type of the specified array and the size of this list.
Я наткнулся на этот фрагмент кода, который его решает.
//Creating a sample ArrayList
List<Long> list = new ArrayList<Long>();
//Adding some long type values
list.add(100l);
list.add(200l);
list.add(300l);
//Converting the ArrayList to a Long
Long[] array = (Long[]) list.toArray(new Long[list.size()]);
//Printing the results
System.out.println(array[0] + " " + array[1] + " " + array[2]);
Преобразование работает следующим образом:
Лучшее, что я придумал без Java 8, было:
public static <T> T[] toArray(List<T> list, Class<T> objectClass) {
if (list == null) {
return null;
}
T[] listAsArray = (T[]) Array.newInstance(objectClass, list.size());
list.toArray(listAsArray);
return listAsArray;
}
Если у кого-то есть лучший способ сделать это, пожалуйста, поделитесь :)
Это работы. Вид.
public static Object[] toArray(List<?> a) {
Object[] arr = new Object[a.size()];
for (int i = 0; i < a.size(); i++)
arr[i] = a.get(i);
return arr;
}
Тогда основной метод.
public static void main(String[] args) {
List<String> list = new ArrayList<String>() {{
add("hello");
add("world");
}};
Object[] arr = toArray(list);
System.out.println(arr[0]);
}
Пример, взятый с этой страницы: http://www.java-examples.com/copy-all-elements-java-arraylist-object-array-example
import java.util.ArrayList;
public class CopyElementsOfArrayListToArrayExample {
public static void main(String[] args) {
//create an ArrayList object
ArrayList arrayList = new ArrayList();
//Add elements to ArrayList
arrayList.add("1");
arrayList.add("2");
arrayList.add("3");
arrayList.add("4");
arrayList.add("5");
/*
To copy all elements of java ArrayList object into array use
Object[] toArray() method.
*/
Object[] objArray = arrayList.toArray();
//display contents of Object array
System.out.println("ArrayList elements are copied into an Array.
Now Array Contains..");
for(int index=0; index < objArray.length ; index++)
System.out.println(objArray[index]);
}
}
/*
Output would be
ArrayList elements are copied into an Array. Now Array Contains..
1
2
3
4
5
Для ArrayList следующие работы:
ArrayList<Foo> list = new ArrayList<Foo>();
//... add values
Foo[] resultArray = new Foo[list.size()];
resultArray = list.toArray(resultArray);
Вы можете использовать toArray() api следующим образом:
ArrayList<String> stringList = new ArrayList<String>();
stringList.add("ListItem1");
stringList.add("ListItem2");
String[] stringArray = new String[stringList.size()];
stringArray = stringList.toArray(stringList);
Значения из массива:
for(String value : stringList)
{
System.out.println(value);
}
Это (ответ Ondrej):
Foo[] array = list.toArray(new Foo[0]);
Является наиболее распространенной идиомой, которую я вижу. Те, кто предполагает, что вы используете фактический размер списка вместо "0", не понимают, что происходит здесь. Вызов toArray не заботится о размере или содержимом данного массива - ему нужен только его тип. Было бы лучше, если бы он взял фактический тип, в этом случае "Foo.class" было бы намного понятнее. Да, эта идиома генерирует фиктивный объект, но в том числе размер списка просто означает, что вы создаете более крупный фиктивный объект. Опять же, объект не используется каким-либо образом; это только тот тип, который вам нужен.
new Foo[0]
то массив new Foo[0]
будет игнорироваться, и будет создан новый массив правильного размера. Если вы используете new Foo[list.size()]
тогда массив new Foo[list.size()]
будет заполнен, и никакой другой массив не будет создан.
tiendas = new ArrayList<Tienda>(tiendasList);
Все реализации коллекции имеют перегруженный конструктор, который берет другую коллекцию (с шаблоном <T>
). Новый экземпляр создается вместе с переданной коллекцией.
Попробуйте следующее:
List list = new ArrayList();
list.add("Apple");
list.add("Banana");
Object[] ol = list.toArray();