Преобразование массива в список в Java

java arrays list containers data-conversion

1236232 просмотра

18 ответа

Как мне преобразовать массив в список на Java?

Я использовал, Arrays.asList()но поведение (и подпись) каким-то образом изменилось с Java SE 1.4.2 (документы теперь в архиве) на 8, и большинство фрагментов, которые я нашел в Интернете, используют поведение 1.4.2.

Например:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
  • на 1.4.2 возвращает список, содержащий элементы 1, 2, 3
  • на 1.5.0+ возвращает список, содержащий массив спама

Во многих случаях это должно быть легко обнаружить, но иногда это может ускользнуть незамеченным:

Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);
Автор: Alexandru Источник Размещён: 12.11.2019 09:34

Ответы (18)


1354 плюса

Решение

В вашем примере это потому, что вы не можете иметь список примитивного типа. Другими словами, List<int>это невозможно.

Однако вы можете List<Integer>использовать Integerкласс, который обертывает intпримитив. Преобразуйте ваш массив в Listс помощью Arrays.asListслужебного метода.

Integer[] spam = new Integer[] { 1, 2, 3 };
List<Integer> list = Arrays.asList(spam);

Смотрите этот код в прямом эфире на IdeOne.com .

Автор: Joe Daley Размещён: 09.04.2010 12:27

147 плюса

В Java 8 вы можете использовать потоки:

int[] spam = new int[] { 1, 2, 3 };
Arrays.stream(spam)
      .boxed()
      .collect(Collectors.toList());
Автор: Ibrahim Arief Размещён: 16.05.2015 11:49

131 плюса

Если говорить о конверсии, то это зависит от того, зачем вам нужен List. Если вам это нужно только для чтения данных. Хорошо, вот и вы:

Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);

Но тогда, если вы делаете что-то вроде этого:

list.add(1);

Вы получаете java.lang.UnsupportedOperationException. Так что для некоторых случаев вам даже нужно это:

Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));

Первый подход на самом деле не конвертирует массив, а «представляет» его как a List. Но массив находится под капотом со всеми его свойствами, такими как фиксированное количество элементов. Обратите внимание, что вам нужно указать тип при построении ArrayList.

Автор: Roman Nikitchenko Размещён: 27.09.2014 04:22

122 плюса

Проблема в том, что varargs были введены в Java5 и, к сожалению, Arrays.asList()перегружены также версией vararg. Так Arrays.asList(spam)понимается компилятором Java5 как параметр vararg массивов int.

Эта проблема объясняется более подробно в Effective Java 2nd Ed., Глава 7, Item 42.

Автор: Péter Török Размещён: 09.04.2010 12:26

93 плюса

Кажется, немного поздно, но вот мои два цента. Мы не можем иметь List<int>как intпримитивный тип, так что мы можем иметь только List<Integer>.

Java 8 (массив int)

int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList()); 

Java 8 и ниже (целочисленный массив)

Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 =  Arrays.asList(integers); // returns a fixed-size list backed by the specified array.
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only

Нужен ArrayList, а не список?

В случае, если мы хотим конкретную реализацию, Listнапример, ArrayListтогда мы можем использовать toCollectionкак:

ArrayList<Integer> list24 = Arrays.stream(integers)
                          .collect(Collectors.toCollection(ArrayList::new));

Почему list21нельзя структурно изменить?

Когда мы используем Arrays.asListразмер возвращаемого списка, он фиксируется, потому что возвращаемый список - это не java.util.ArrayListзакрытый статический класс, определенный внутри java.util.Arrays. Так что, если мы добавим или удалим элементы из возвращенного списка, UnsupportedOperationExceptionбудет выброшено. Таким образом, мы должны идти, list22когда мы хотим изменить список. Если у нас есть Java8, то мы также можем пойти с list23.

Чтобы быть понятным, list21можно изменить в том смысле, что мы можем вызвать, list21.set(index,element)но этот список не может быть структурно изменен, т.е. не может добавлять или удалять элементы из списка. Вы также можете проверить этот вопрос .


Если мы хотим неизменный список, мы можем обернуть его следующим образом:

List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));

Еще один момент, на который следует обратить внимание: метод Collections.unmodifiableListвозвращает неизменяемое представление указанного списка. Неизменяемая коллекция представлений - это коллекция, которая не может быть изменена, а также является представлением резервной коллекции. Обратите внимание, что изменения в резервной коллекции все еще возможны, и если они происходят, они видны через неизменяемое представление.

У нас может быть действительно неизменный список в Java 10.

Java 10 (действительно неизменный список) двумя способами:

  1. List.copyOf(Arrays.asList(integers))
  2. Arrays.stream(integers).collect(Collectors.toUnmodifiableList());

Также проверьте этот мой ответ для большего.

Автор: i_am_zero Размещён: 23.12.2015 05:07

10 плюса

Недавно мне пришлось преобразовать массив в список. Позже программа отфильтровала список, пытаясь удалить данные. Когда вы используете функцию Arrays.asList (array), вы создаете коллекцию фиксированного размера: вы не можете ни добавлять, ни удалять. Эта запись объясняет проблему лучше, чем я: почему я получаю исключение UnsupportedOperationException при попытке удалить элемент из списка? ,

В итоге мне пришлось сделать «ручное» преобразование:

    List<ListItem> items = new ArrayList<ListItem>();
    for (ListItem item: itemsArray) {
        items.add(item);
    }

Я полагаю, я мог бы добавить преобразование из массива в список, используя операцию List.addAll (items).

Автор: Steve Gelman Размещён: 31.08.2014 05:26

9 плюса

Еще короче

List<Integer> list = Arrays.asList(1, 2, 3, 4);
Автор: Vitaliy Sokolov Размещён: 17.03.2016 09:55

6 плюса

Использование массивов

Это самый простой способ конвертировать массив в List. Однако, если вы попытаетесь добавить новый элемент или удалить существующий элемент из списка, UnsupportedOperationExceptionбудет выброшено.

Integer[] existingArray = {1, 2, 3};
List<Integer> list1 = Arrays.asList(existingArray);
List<Integer> list2 = Arrays.asList(1, 2, 3);

// WARNING:
list2.add(1);     // Unsupported operation!
list2.remove(1);  // Unsupported operation!

Использование ArrayList или других реализаций списка

Вы можете использовать forцикл для добавления всех элементов массива в Listреализацию, например ArrayList:

List<Integer> list = new ArrayList<>();
for (int i : new int[]{1, 2, 3}) {
  list.add(i);
}

Использование Stream API в Java 8

Вы можете превратить массив в поток, а затем собрать поток с помощью различных сборщиков: сборщик по умолчанию в Java 8 используется ArrayListза экраном, но вы также можете навязать предпочтительную реализацию.

List<Integer> list1, list2, list3;
list1 = Stream.of(1, 2, 3).collect(Collectors.toList());
list2 = Stream.of(1, 2, 3).collect(Collectors.toCollection(ArrayList::new));
list3 = Stream.of(1, 2, 3).collect(Collectors.toCollection(LinkedList::new));

Смотрите также:

Автор: Mincong Huang Размещён: 04.03.2017 10:12

4 плюса

Другой обходной путь, если вы используете apache commons-lang:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(ArrayUtils.toObject(spam));

Где ArrayUtils.toObject конвертируется int[]вInteger[]

Автор: alaster Размещён: 21.09.2015 12:27

4 плюса

В Java 9 у вас есть еще более элегантное решение использования неизменяемых списков с помощью нового метода фабрики удобства List.of:

List<String> immutableList = List.of("one","two","three");

(бесстыдно скопировано отсюда )

Автор: Pierluigi Vernetto Размещён: 28.11.2017 11:22

4 плюса

Если вы ориентируетесь на Java 8 (или более позднюю версию), вы можете попробовать это:

int[] numbers = new int[] {1, 2, 3, 4};
List<Integer> integers = Arrays.stream(numbers)
                        .boxed().collect(Collectors.<Integer>toList());

НОТА:

Обратите внимание Collectors.<Integer>toList(), что этот универсальный метод помогает избежать ошибки «Несоответствие типов: невозможно преобразовать из List<Object>в List<Integer>».

Автор: nybon Размещён: 12.08.2016 02:52

3 плюса

Вы должны бросить в массив

Arrays.asList((Object[]) array)
Автор: Giancarlo Frison Размещён: 12.08.2014 01:08

3 плюса

Один лайнер:

List<Integer> list = Arrays.asList(new Integer[] {1, 2, 3, 4});
Автор: Bhushan Размещён: 11.03.2016 04:15

3 плюса

  1. Использование гуавы:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = Lists.newArrayList(sourceArray);
    
  2. Использование коллекций Apache Commons:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = new ArrayList<>(6);
    CollectionUtils.addAll(list, array);
    
Автор: Danail Tsvetanov Размещён: 02.04.2018 01:03

2 плюса

Если это поможет: у меня возникла та же проблема, и я просто написал универсальную функцию, которая принимает массив и возвращает ArrayList того же типа с тем же содержимым:

public static <T> ArrayList<T> ArrayToArrayList(T[] array) {
    ArrayList<T> list = new ArrayList<T>();
    for(T elmt : array) list.add(elmt);
    return list;
}
Автор: kleines filmröllchen Размещён: 05.09.2017 03:19

0 плюса

Так что это зависит от того, какую версию Java вы пытаетесь

Java 7

 Arrays.asList(1, 2, 3);

ИЛИ ЖЕ

       final String arr[] = new String[] { "G", "E", "E", "K" };
       final List<String> initialList = new ArrayList<String>() {{
           add("C");
           add("O");
           add("D");
           add("I");
           add("N");
       }};

       // Elements of the array are appended at the end
       Collections.addAll(initialList, arr);

ИЛИ ЖЕ

Integer[] arr = new Integer[] { 1, 2, 3 };
Arrays.asList(arr);

В Java 8

int[] num = new int[] {1, 2, 3};
List<Integer> list = Arrays.stream(num)
                        .boxed().collect(Collectors.<Integer>toList())

Ссылка - http://www.codingeek.com/java/how-to-convert-array-to-list-in-java/

Автор: Hitesh Garg Размещён: 28.07.2017 06:21

0 плюса

Заданный массив:

    int[] givenArray = {2,2,3,3,4,5};

Преобразование целочисленного массива в список целых

Один из способов: boxed () -> возвращает IntStream

    List<Integer> givenIntArray1 = Arrays.stream(givenArray)
                                  .boxed()
                                  .collect(Collectors.toList());

Второй способ: сопоставить каждый элемент потока с целым числом, а затем собрать

ПРИМЕЧАНИЕ. Используя mapToObj, вы можете преобразовать каждый элемент int в поток строк, символьный поток и т. Д., Указав регистр i в (char) i

    List<Integer> givenIntArray2 = Arrays.stream(givenArray)
                                         .mapToObj(i->i)
                                         .collect(Collectors.toList());

Пример преобразования одного массива в другой тип:

List<Character> givenIntArray2 = Arrays.stream(givenArray)
                                             .mapToObj(i->(char)i)
                                             .collect(Collectors.toList());
Автор: Arpan Saini Размещён: 07.09.2019 07:16

-1 плюса

используйте две строки кода для преобразования массива в список, если вы используете его в целочисленном значении, вы должны использовать тип autoboxing для примитивного типа данных

  Integer [] arr={1,2};
  Arrays.asList(arr);
Автор: yousef Размещён: 11.06.2017 08:31
Вопросы из категории :
32x32