2009-07-02 3 views
218

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

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

ответ

160

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

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

Лучше инициализирует список с размером массива –

+0

@David Рабиновича - Не уверен, что сказать, что :) – willcodejavaforfood

+0

Если вы настаиваете, чтобы использовать Реализация ArrayList, почему бы просто не использовать перегруженный конструктор: new ArrayList (myArray)? –

8

Это также стоит проверить this bug report, который был закрыт с причиной «дефектом» и следующий текст:.

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

52

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

Этот код будет не создать список из 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

Приятная информация! –

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

TestCase:

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

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

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. – Adamski

33

Самый маленький фрагмент кода не будет:

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

где ArrayUtils происходит от достоянию-Ланг :)

+6

Просто обратите внимание на' ArrayUtils', это относительно большая библиотека для Android-приложения. – msysmilu

147

Кроме того, из guava libraries ... com.google.common.primitives.Ints:

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

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

+0

Благодарим вас, спасибо! Также работает для Longs.asList (long ...). – craastad

+2

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

4

Лучший выстрел:

** 
* 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); 
+0

Мне это больше всего нравится. Но я все равно буду использовать guava для решения с прямым доступом :) – dantuch

14

В 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()); 
+1

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

135

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

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

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

+0

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

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

0
/* 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); 
3

В Java 8:

int[] arr = {1,2,3}; 
IntStream.of(arr).boxed().collect(Collectors.toList()); 
Смежные вопросы