Преобразовать список в массив в Java [дубликаты]

438

Как преобразовать 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.

  • 18
    ArrayList не является массивом. Tienda [] будет массивом.
Теги:
arrays
list
arraylist

12 ответов

964
Лучший ответ

Или:

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);
  • 14
    для первой формы я предпочитаю list.toArray(new Foo[0]) как это дает понять, что параметр передается только для информации о типе, а размер не имеет значения.
  • 20
    @MarcusJuniusBrutus Нет, вы не правы. если вы используете new Foo[0] то вы создаете дополнительный бесполезный массив. Проверьте исходный код, чтобы проверить.
Показать ещё 14 комментариев
151

Альтернатива в Java 8:

String[] strings = list.stream().toArray(String[]::new);
  • 21
    +1 Stream API - это круто.
  • 1
    Но лучше ли использовать Stream в этом конкретном случае?
Показать ещё 4 комментария
33

Я думаю, что это самый простой способ:

Foo[] array = list.toArray(new Foo[0]);
  • 4
    Может быть, установить правильный размер массива, как вы, очевидно, знаете это
  • 6
    ^ Нет необходимости устанавливать размер массива, если это предполагаемый стиль. Документация для toArray (T [] a): 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.
Показать ещё 4 комментария
2

Я наткнулся на этот фрагмент кода, который его решает.

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

Преобразование работает следующим образом:

  • Он создает новый длинный массив с размером исходного списка
  • Он преобразует исходный массив ArrayList в массив, используя только что созданный
  • Он переводит этот массив в длинный массив (Long []), который я назвал "array"
  • 0
    Публикация чужого кода, который работает без каких-либо комментариев или пояснений к коду, не очень убедительный ответ (но не -1, поскольку это технически правильно).
  • 0
    Однако ваш комментарий заставляет других все равно понизить мой ответ.
Показать ещё 1 комментарий
0

Лучшее, что я придумал без 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;
}

Если у кого-то есть лучший способ сделать это, пожалуйста, поделитесь :)

0

Это работы. Вид.

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]);
}
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
  • 3
    Пожалуйста, не копируйте чужие работы как свои собственные, без указания авторства. java-examples.com/...
0

Для ArrayList следующие работы:

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

//... add values

Foo[] resultArray = new Foo[list.size()];
resultArray = list.toArray(resultArray);
-1

Вы можете использовать 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);
}
-2

Это (ответ Ondrej):

Foo[] array = list.toArray(new Foo[0]);

Является наиболее распространенной идиомой, которую я вижу. Те, кто предполагает, что вы используете фактический размер списка вместо "0", не понимают, что происходит здесь. Вызов toArray не заботится о размере или содержимом данного массива - ему нужен только его тип. Было бы лучше, если бы он взял фактический тип, в этом случае "Foo.class" было бы намного понятнее. Да, эта идиома генерирует фиктивный объект, но в том числе размер списка просто означает, что вы создаете более крупный фиктивный объект. Опять же, объект не используется каким-либо образом; это только тот тип, который вам нужен.

  • 19
    Вам нужно проверить исходный код. Если вы используете new Foo[0] то массив new Foo[0] будет игнорироваться, и будет создан новый массив правильного размера. Если вы используете new Foo[list.size()] тогда массив new Foo[list.size()] будет заполнен, и никакой другой массив не будет создан.
-4
tiendas = new ArrayList<Tienda>(tiendasList);

Все реализации коллекции имеют перегруженный конструктор, который берет другую коллекцию (с шаблоном <T>). Новый экземпляр создается вместе с переданной коллекцией.

  • 9
    Таким образом, вы просто создаете экземпляр другого списка, а не массива
-6

Попробуйте следующее:

List list = new ArrayList();
list.add("Apple");
list.add("Banana");

Object[] ol = list.toArray();
  • 3
    Не полезно, так как обычно работают с универсальными типами.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню