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

383

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

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

pupeno
источник
Мы можем использовать 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);
}
willcodejavaforfood
источник
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());
mikeyreilly
источник
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...)
louisgab
источник
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());
user2037659
источник
3
Почему бы просто не использовать коллектор?
assylias
19

В Java 8:

int[] arr = {1,2,3};
IntStream.of(arr).boxed().collect(Collectors.toList());
Neeraj
источник
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
DFA
источник
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);

humblefoolish
источник
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());

увидеть это

hamidreza75
источник