Làm cách nào để chuyển đổi int [] thành List <Integer> trong Java?


382

Làm cách nào để chuyển đổi int[]thành List<Integer>Java?

Tất nhiên, tôi quan tâm đến bất kỳ câu trả lời nào khác ngoài việc thực hiện nó trong một vòng lặp, từng mục. Nhưng nếu không có câu trả lời nào khác, tôi sẽ chọn câu trả lời đó là tốt nhất để cho thấy thực tế rằng chức năng này không phải là một phần của Java.


Chúng tôi có thể sử dụng IntStream.Of (mảng) .collect (Collector.toList)
Saroj Kumar Sahoo

Câu trả lời:


259

Không có phím tắt để chuyển đổi từ int[]tới List<Integer>như Arrays.asListkhông đối phó với boxing và chỉ sẽ tạo ra một List<int[]>mà không phải là những gì bạn muốn. Bạn phải làm một phương pháp tiện ích.

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

32
Tốt nhất là khởi tạo danh sách với kích thước của mảng
David Rabinowitz

110
for (int i: ints) intList.add (i);
Stephen Denne

18
@willcodejavaforfood - David có nghĩa là điều này tốt hơn: ArrayList mới <Integer> (ints.length);
Stephen Denne

12
@willcodejavaforfood: khai báo kích thước của ArrayList khi nó đang được xây dựng sẽ ngăn nó phải thay đổi kích thước bên trong sau khi thêm một số tiền nhất định. Không chắc chắn nếu lợi ích là nhỏ, nhưng chắc chắn có một lợi ích.
Grundlefleck

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

350

Dòng

Trong Java 8, bạn có thể làm điều này

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

21
Tương đương với: Arrays.stream (ints) .boxed (). Coll (Collector.toList ());
njfrost

4
@njfrost Bạn đã đúng và IntStream.of chỉ cần gọi Arrays.stream vì vậy tôi đã cải thiện câu trả lời theo đề xuất của bạn
mikeyreilly

Vì một số lý do, điều này dường như không trả về loại kết quả dự kiến ​​trên Android Studio (hoạt động trên nhật thực) Nó cho biết, Danh sách dự kiến ​​<Integer> Danh sách tìm thấy <Object>.
Eugenio Lopez

Nó trông gọn gàng và súc tích nhưng khi tôi sử dụng nó trái ngược với giải pháp cơ bản được cung cấp bởi @willcodejavaforfood trên leetcode, hiệu suất chương trình bị suy giảm về bộ nhớ cũng như thời gian chạy
chitresh sirohi

@chitreshsirohi đó là vì các hàm lambda được sử dụng bên trong các luồng dẫn đến Java để tạo ra một số lớp ẩn danh.
Ashvin Sharma

175

Cũng từ thư viện ổi ... com.google.common.primologists.Ints:

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

11
Điều này nên là câu trả lời đúng. Xem câu thứ hai của câu hỏi: "Tất nhiên, tôi quan tâm đến bất kỳ câu trả lời nào khác ngoài việc thực hiện nó trong một vòng lặp, từng mục."
josketres

Cảm ơn bạn, cảm ơn bạn, cảm ơn bạn! Cũng hoạt động cho Longs.asList (dài ...).
craastad

2
Có một vài sự tinh tế ở đây. Danh sách trả về sử dụng mảng được cung cấp làm kho lưu trữ dự phòng, vì vậy bạn không nên thay đổi mảng. Danh sách này cũng không đảm bảo danh tính của các đối tượng Integer chứa. Đó là, kết quả của list.get (0) == list.get (0) không được chỉ định.
pburka

1
Cảnh giác với số tham chiếu phương thức trên Android khi thêm thư viện. Tìm tốt mặc dù.
milosmns

95

Arrays.asList sẽ không hoạt động như một số câu trả lời khác mong đợi.

Mã này sẽ không tạo danh sách 10 số nguyên. Nó sẽ in 1 , không phải 10 :

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

Điều này sẽ tạo ra một danh sách các số nguyên:

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

Nếu bạn đã có mảng ints, không có cách nhanh chóng để chuyển đổi, tốt hơn hết là bạn nên sử dụng vòng lặp.

Mặt khác, nếu mảng của bạn có Đối tượng, không phải là nguyên thủy trong đó, Arrays.asList sẽ hoạt động:

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

2
Xin lưu ý rằng danh sách đó là bất biến
Danielson

51

Tôi sẽ thêm một câu trả lời khác bằng một phương pháp khác; không có vòng lặp nhưng một lớp ẩn danh sẽ sử dụng các tính năng tự động đóng hộp:

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 này ngắn hơn của tôi nhưng của tôi hoạt động cho tất cả các loại nguyên thủy
dfa

5
Mặc dù nhanh hơn và sử dụng ít bộ nhớ hơn so với việc tạo ArrayList, nhưng sự đánh đổi là List.add () và List.remove () không hoạt động.
Stephen Denne

3
Tôi khá thích giải pháp này cho các mảng lớn với các mẫu truy cập thưa thớt nhưng đối với các phần tử được truy cập thường xuyên, nó sẽ dẫn đến nhiều tức thời không cần thiết của Integer (ví dụ: nếu bạn truy cập cùng một phần tử 100 lần). Ngoài ra, bạn sẽ cần xác định Iterator và bọc giá trị trả về trong Collections.unmodifiableList.
Adamski

@Christoffer cảm ơn. Tôi đã thêm setphương thức và bây giờ tôi thậm chí có thể sắp xếp mảng ...
freedev

39

Đoạn mã nhỏ nhất sẽ là:

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

trong đó ArrayUtils đến từ commons-lang :)


9
Chỉ cần lưu ý rằng ArrayUtilsđó là một thư viện lớn tương đối cho một ứng dụng Android
msysmilu

Các hoạt động ngược lại được mô tả ở đây: stackoverflow.com/a/960507/1333157 ArrayUtils.toPrimitive(...) là chìa khóa.
ZeroOne

26

Trong Java 8 với luồng:

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

hoặc với người sưu tầm

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

3
Tại sao không chỉ đơn giản là sử dụng một bộ sưu tập?
assylias

19

Trong Java 8:

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

16

Nếu bạn đang sử dụng java 8, chúng tôi có thể sử dụng API luồng để chuyển đổi nó thành một danh sách.

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

Bạn cũng có thể sử dụng IntStream để chuyển đổi.

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

Có thư viện bên ngoài khác như ổi và apache commons cũng có sẵn chuyển đổi nó.

chúc mừng


11

Cũng đáng kiểm tra báo cáo lỗi này , đã bị đóng với lý do "Không phải là lỗi" và văn bản sau:

"Autoboxing của toàn bộ mảng không phải là hành vi được chỉ định, vì lý do chính đáng. Nó có thể rất tốn kém cho các mảng lớn."


7

hãy thử với lớp này:

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

thử nghiệm:

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

5

Bức ảnh đẹp nhất:

**
 * 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;
    }
}
  • Hỗ trợ lấy và thiết lập.
  • Không trùng lặp dữ liệu bộ nhớ.
  • Không lãng phí thời gian trong các vòng lặp.

Ví dụ:

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

Tôi thích nó nhất. Nhưng tôi vẫn sử dụng ổi để có giải pháp thẳng tiến :)
dantuch

1

Nếu bạn mở để sử dụng thư viện bên thứ ba, điều này sẽ hoạt động trong Bộ sưu tập Eclipse :

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

Lưu ý: Tôi là người đi làm cho Bộ sưu tập Eclipse .


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

Cái này thì sao:

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


1

Đây là một giải pháp:

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

Đầu ra:

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

1

Đây là một khả năng khác, một lần nữa với Luồng Java 8:

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

0

Đây là một cách chung để chuyển đổi mảng thành 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;
}

Sử dụng

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

xem cái này

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.