Как конвертировать int [] в список <Integer> в Java?


383

Как конвертировать int[]в List<Integer>в Java?

Конечно, меня интересует любой другой ответ, кроме как делать это в цикле, пункт за элементом. Но если нет другого ответа, я выберу его как лучший, чтобы показать тот факт, что эта функциональность не является частью Java.


Мы можем использовать IntStream.Of (массив) .collect (Collectors.toList)
Сародж Кумар Саху

Ответы:


259

Там нет ярлыка для перехода от int[]к , List<Integer>как Arrays.asListне иметь дело с боксом и будет просто создать List<int[]>что не то , что вы хотите. Вы должны сделать служебный метод.

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

32
Лучше всего инициализировать список размером массива
Дэвид Рабинович

110
for (int i: ints) intList.add (i);
Стивен Денн

18
@willcodejavaforfood - Дэвид означает, что это лучше: new ArrayList <Integer> (ints.length);
Стивен Денн

12
@willcodejavaforfood: объявление размера ArrayList при его создании предотвратит внутреннее изменение размера после добавления определенной суммы. Не уверен, что выгода мала, но выгода определенно есть.
Грундлефлек

10
new ArrayList<Integer>() {{ for (int i : ints) add(i); }}
saka1029

350

Streams

В Java 8 вы можете сделать это

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

21
Эквивалентно: Arrays.stream (ints) .boxed (). Collect (Collectors.toList ());
njfrost

4
@njfrost Вы правы, и IntStream.of просто вызывает Arrays.stream, поэтому я улучшил ответ, следуя вашему предложению
mikeyreilly

По какой-то причине это, похоже, не возвращает ожидаемый тип результата в Android Studio (работает при затмении). В нем говорится, что ожидаемый List <Integer> найден List <Object>.
Эудженио Лопес

Это выглядит чистым и лаконичным, но когда я использовал это в отличие от базового решения, предоставляемого @willcodejavaforfood для leetcode, производительность программы снизилась с точки зрения памяти и времени выполнения
chitresh sirohi

@chitreshsirohi, потому что лямбда-функции, используемые внутри потоков, приводят к тому, что Java создает анонимные классы.
Ашвин Шарма

175

Также из библиотек гуавы ... com.google.common.primitives.Ints:

List<Integer> Ints.asList(int...)

11
Этот должен быть правильный ответ. См. Второе предложение вопроса: «Конечно, меня интересует любой другой ответ, кроме как делать это в цикле, пункт за элементом».
Josketres

Спасибо Спасибо спасибо! Также работает для Longs.asList (long ...).
craastad

2
Здесь есть несколько тонкостей. Возвращенный список использует предоставленный массив в качестве резервного хранилища, поэтому не следует изменять массив. Список также не гарантирует идентичность содержащихся объектов Integer. То есть результат list.get (0) == list.get (0) не указан.
pburka

1
Остерегайтесь подсчета ссылок метода на Android при добавлении библиотек. Хорошая находка, хотя.
milosmns

96

Arrays.asList не будет работать, как ожидают некоторые другие ответы.

Этот код не будет создавать список из 10 целых чисел. Будет напечатано 1 , а не 10 :

int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
List lst = Arrays.asList(arr);
System.out.println(lst.size());

Это создаст список целых чисел:

List<Integer> lst = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

Если у вас уже есть массив целых чисел, нет быстрого способа конвертации, лучше использовать цикл.

С другой стороны, если ваш массив содержит объекты, а не примитивы, Arrays.asList будет работать:

String str[] = { "Homer", "Marge", "Bart", "Lisa", "Maggie" };
List<String> lst = Arrays.asList(str);

2
Обратите внимание, что этот список неизменен
Даниэльсон

51

Я добавлю другой ответ другим методом; нет цикла, но есть анонимный класс, который будет использовать функции автобокса:

public List<Integer> asList(final int[] is)
{
    return new AbstractList<Integer>() {
            public Integer get(int i) { return is[i]; }
            public int size() { return is.length; }
    };
}

1
+1 это короче моего, но мой работает для всех типов примитивов
dfa

5
Хотя это быстрее и использует меньше памяти, чем создание ArrayList, компромисс между List.add () и List.remove () не работает.
Стивен Денн

3
Мне очень нравится это решение для больших массивов с разреженными шаблонами доступа, но для часто используемых элементов оно приведет к множеству ненужных экземпляров Integer (например, если вы обращались к одному и тому же элементу 100 раз). Также вам нужно определить Iterator и обернуть возвращаемое значение в Collections.unmodifiableList.
Адамски

@Christoffer спасибо. Я добавил setметод, и теперь я могу даже отсортировать массив ...
freedev

39

Наименьший кусок кода будет:

public List<Integer> myWork(int[] array) {
    return Arrays.asList(ArrayUtils.toObject(array));
}

откуда ArrayUtils происходит от общего достояния :)


9
Просто отметьте, ArrayUtilsчто это относительно большая библиотека для приложения для Android
msysmilu

Здесь описана противоположная операция: ключом является stackoverflow.com/a/960507/1333157 ArrayUtils.toPrimitive(...) .
ZeroOne

26

В Java 8 с потоком:

int[] ints = {1, 2, 3};
List<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, Arrays.stream(ints).boxed().toArray(Integer[]::new));

или с коллекционерами

List<Integer> list =  Arrays.stream(ints).boxed().collect(Collectors.toList());

3
Почему бы просто не использовать коллектор?
assylias

19

В Java 8:

int[] arr = {1,2,3};
IntStream.of(arr).boxed().collect(Collectors.toList());

16

Если вы используете Java 8, мы можем использовать потоковый API, чтобы преобразовать его в список.

List<Integer> list = Arrays.stream(arr)     // IntStream 
                                .boxed()        // Stream<Integer>
                                .collect(Collectors.toList());

Вы также можете использовать IntStream для конвертации.

List<Integer> list = IntStream.of(arr) // return Intstream
                                    .boxed()        // Stream<Integer>
                                    .collect(Collectors.toList());

Есть и другие внешние библиотеки, такие как guava и apache commons, также доступные для конвертации.

веселит.


11

Также стоит проверить этот отчет об ошибке , который был закрыт по причине «Не дефект» и следующий текст:

«Автобокс целых массивов - не определенное поведение, по уважительной причине. Это может быть слишком дорого для больших массивов».


7

попробуйте этот класс:

class PrimitiveWrapper<T> extends AbstractList<T> {

    private final T[] data;

    private PrimitiveWrapper(T[] data) {
        this.data = data; // you can clone this array for preventing aliasing
    }

    public static <T> List<T> ofIntegers(int... data) {
        return new PrimitiveWrapper(toBoxedArray(Integer.class, data));
    }

    public static <T> List<T> ofCharacters(char... data) {
        return new PrimitiveWrapper(toBoxedArray(Character.class, data));
    }

    public static <T> List<T> ofDoubles(double... data) {
        return new PrimitiveWrapper(toBoxedArray(Double.class, data));
    }  

    // ditto for byte, float, boolean, long

    private static <T> T[] toBoxedArray(Class<T> boxClass, Object components) {
        final int length = Array.getLength(components);
        Object res = Array.newInstance(boxClass, length);

        for (int i = 0; i < length; i++) {
            Array.set(res, i, Array.get(components, i));
        }

        return (T[]) res;
    }

    @Override
    public T get(int index) {
        return data[index];
    }

    @Override
    public int size() {
        return data.length;
    }
}

прецедент:

List<Integer> ints = PrimitiveWrapper.ofIntegers(10, 20);
List<Double> doubles = PrimitiveWrapper.ofDoubles(10, 20);
// etc

5

Лучший снимок:

**
 * Integer modifiable fix length list of an int array or many int's.
 *
 * @author Daniel De Leon.
 */
public class IntegerListWrap extends AbstractList<Integer> {

    int[] data;

    public IntegerListWrap(int... data) {
        this.data = data;
    }

    @Override
    public Integer get(int index) {
        return data[index];
    }

    @Override
    public Integer set(int index, Integer element) {
        int r = data[index];
        data[index] = element;
        return r;
    }

    @Override
    public int size() {
        return data.length;
    }
}
  • Поддержка получить и установить.
  • Нет дублирования данных в памяти.
  • Не тратить время на петли.

Примеры:

int[] intArray = new int[]{1, 2, 3};
List<Integer> integerListWrap = new IntegerListWrap(intArray);
List<Integer> integerListWrap1 = new IntegerListWrap(1, 2, 3);

Мне это нравится больше всего. Но я все еще использовал бы гуаву, чтобы иметь прямое решение :)
Данту

1

Если вы открыты для использования сторонней библиотеки, это будет работать в Eclipse Collections :

int[] a = {1, 2, 3};
List<Integer> integers = IntLists.mutable.with(a).collect(i -> i);
Assert.assertEquals(Lists.mutable.with(1, 2, 3), integers);

Примечание: я являюсь коммиттером для Eclipse Collections .


1
   /* Integer[] to List<Integer> */



        Integer[] intArr = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
        List<Integer> arrList = new ArrayList<>();
        arrList.addAll(Arrays.asList(intArr));
        System.out.println(arrList);


/* Integer[] to Collection<Integer> */


    Integer[] intArr = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
    Collection<Integer> c = Arrays.asList(intArr);

1

Что насчет этого:

int[] a = {1,2,3}; Integer[] b = ArrayUtils.toObject(a); List<Integer> c = Arrays.asList(b);


1

Вот решение:

int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

Integer[] iArray = Arrays.stream(array).boxed().toArray(Integer[]::new);
System.out.println(Arrays.toString(iArray));

List<Integer> list = new ArrayList<>();
Collections.addAll(list, iArray);
System.out.println(list);

Вывод:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

1

Вот еще одна возможность, опять же с Java 8 Streams:

void intArrayToListOfIntegers(int[] arr, List<Integer> list) {
    IntStream.range(0, arr.length).forEach(i -> list.add(arr[i]));
}

0

Вот универсальный способ конвертировать массив в ArrayList

<T> ArrayList<T> toArrayList(Object o, Class<T> type){
    ArrayList<T> objects = new ArrayList<>();
    for (int i = 0; i < Array.getLength(o); i++) {
        //noinspection unchecked
        objects.add((T) Array.get(o, i));
    }
    return objects;
}

Применение

ArrayList<Integer> list = toArrayList(new int[]{1,2,3}, Integer.class);

0
int[] arr = { 1, 2, 3, 4, 5 };

List<Integer> list = Arrays.stream(arr)     // IntStream
                            .boxed()        // Stream<Integer>
                            .collect(Collectors.toList());

увидеть это

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.