Вопрос

Как я могу преобразовать массив в список в 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+ возвращает список, содержащий спам Array

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

Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);
Это было полезно?

Решение

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

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

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

Видеть это Код запущен в прямом эфире на IDeone.com.

Другие советы

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

int[] spam = new int[] { 1, 2, 3 };
Arrays.stream(spam)
      .boxed()
      .collect(Collectors.toList());

Говоря о пути конверсии, это зависит от того, почему вам нужен ваш 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));

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

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

Эта проблема объясняется более подробно в эффективных Java 2nd Ed., Глава 7, пункт 42.

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

Java 8 (INT Array)

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

Нужен арайлист и не список?

Если мы хотим конкретную реализацию 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) Но этот список не может быть структурно изменен IE не может добавлять или удалять элементы из списка. Вы также можете проверить это вопрос.


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

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());

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

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

В конце концов, мне пришлось сделать «руководство» конвертацию:

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

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

Даже короче:

List<Integer> list = Arrays.asList(1, 2, 3, 4);

Используя массивы

Это самый простой способ преобразовать массив на 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);
}

Использование потока 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));

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

Еще один обходной путь, если вы используете Apache Commons-Lang:

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

Где Arrayutils.toobject. преобразует int[] к Integer[]

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

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

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

Если вы нацеливаете 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>".

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

Arrays.asList((Object[]) array)

Один лайнер:

List<Integer> list = Arrays.asList(new Integer[] {1, 2, 3, 4});
  1. Используя Guava:

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

Так что это зависит от того, на какой версии 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/

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

public static <T> ArrayList<T> ArrayToArrayList(T[] array) {
    ArrayList<T> list = new ArrayList<T>();
    for(T elmt : array) list.add(elmt);
    return list;
}

Учитывая массив:

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

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

Один из способов: в штучной упаковке () -> возвращает Intstream

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

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

ПРИМЕЧАНИЕ: Используя maptoobj, вы можете скрыть каждый элемент int в String Stream, Star Stream и т. Д., Корпус 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());

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

  Integer [] arr={1,2};
  Arrays.asList(arr);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top