[java] 정수를 포함하는 ArrayList를 기본 int 배열로 변환하는 방법은 무엇입니까?

다음 코드를 사용하여 Integer 객체를 포함하는 ArrayList를 기본 int []로 변환하려고하는데 컴파일 시간 오류가 발생합니다. Java로 변환 할 수 있습니까?

List<Integer> x =  new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);



답변

변환 할 수는 있지만 자동으로 수행 할 수있는 것이 없다고 생각합니다.

public static int[] convertIntegers(List<Integer> integers)
{
    int[] ret = new int[integers.size()];
    for (int i=0; i < ret.length; i++)
    {
        ret[i] = integers.get(i).intValue();
    }
    return ret;
}

(이 중 하나 integers또는 그 안의 요소가 이면 NullPointerException이 발생합니다 null.)

편집 : 의견에 따라 LinkedList다음 과 같은 목록으로 과도한 비용을 피하기 위해 목록 반복자를 사용할 수 있습니다 .

public static int[] convertIntegers(List<Integer> integers)
{
    int[] ret = new int[integers.size()];
    Iterator<Integer> iterator = integers.iterator();
    for (int i = 0; i < ret.length; i++)
    {
        ret[i] = iterator.next().intValue();
    }
    return ret;
}


답변

당신이 사용하는 경우 또 다른 방법이 있습니다.

int[] arr = list.stream().mapToInt(i -> i).toArray();

그것이하는 일은 :

  • Stream<Integer>목록에서 가져 오기
  • IntStream각 요소를 자체에 매핑하여 (identity function) intInteger객체가 보유한 값을 unboxing하여 획득 (Java 5부터 자동으로 수행)
  • int호출 하여 배열 얻기toArray

intValue메소드 참조를 통해 명시 적으로 호출 할 수도 있습니다 .

int[] arr = list.stream().mapToInt(Integer::intValue).toArray();

목록에 참조 NullPointerException가 있으면 얻을 수 있다고 언급 할 가치가 있습니다 null. 다음과 같이 스트림 파이프 라인에 필터링 조건을 추가하면 쉽게 피할 수 있습니다.

                       //.filter(Objects::nonNull) also works
int[] arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray();

예:

List<Integer> list = Arrays.asList(1, 2, 3, 4);
int[] arr = list.stream().mapToInt(i -> i).toArray(); //[1, 2, 3, 4]

list.set(1, null); //[1, null, 3, 4]
arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray(); //[1, 3, 4]


답변

구글 구아바

Google Guava 는에 전화하여 깔끔한 방법을 제공합니다 Ints.toArray.

List<Integer> list = ...;
int[] values = Ints.toArray(list);


답변

Apache Commons에는 ArrayUtils 클래스가 있으며이 메소드에는 toPrimitive () 메소드가 있습니다.

import org.apache.commons.lang.ArrayUtils;
...
    List<Integer> list = new ArrayList<Integer>();
    list.add(new Integer(1));
    list.add(new Integer(2));
    int[] intArray = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));

그러나 Jon이 보여 주었 듯이 외부 라이브러리를 사용하는 대신 혼자서이 작업을 수행하는 것이 매우 쉽습니다.


답변

list.get(i)List 구현에 따라 성능이 떨어질 수 있으므로 List 반복자를 사용하여 반복하는 것이 더 좋습니다 .

private int[] buildIntArray(List<Integer> integers) {
    int[] ints = new int[integers.size()];
    int i = 0;
    for (Integer n : integers) {
        ints[i++] = n;
    }
    return ints;
}


답변

사용 달러하는 것은 매우 간단해야한다 :

List<Integer> list = $(5).toList(); // the list 0, 1, 2, 3, 4  
int[] array = $($(list).toArray()).toIntArray();

중간 toArray()통화 를 제거하기 위해 DSL을 개선 할 계획입니다


답변

이것은 나를 위해 잘 작동합니다 🙂

에서 찾을 수 https://www.techiedelight.com/convert-list-integer-array-int/

import java.util.Arrays;
import java.util.List;

class ListUtil
{
    // Program to convert list of integer to array of int in Java
    public static void main(String args[])
    {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

        int[] primitive = list.stream()
                            .mapToInt(Integer::intValue)
                            .toArray();

        System.out.println(Arrays.toString(primitive));
    }
}