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


297

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

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

10
그 질문에 대한 정확한 사본은 아닙니다 (아직 멀지는 않지만)
— Jonik

1
예, 이것은 ArrayList입니다. "duplicate"는 일반 배열에 관한 것입니다.
— Scott McIntyre

3
기본 정수가 필요하지 않은 경우 다음을 사용할 수 있습니다. List<Integer> x = new ArrayList<Integer>(); Integer[] n = x.toArray(new Integer[0]);
— Evorlor

답변:


219

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

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

21
액세스가 O (1)이 아닌 목록에 대한 성능 적중을 피하기 위해 List 반복자를 사용하여 반복하는 것이 좋습니다 (각각에 대해).
— Matthew Willis

@Matthew : 그렇습니다-아마도 그것을 대안으로 제공 할 것입니다.
— Jon Skeet

1
또한 ArrayList가 Collection 상속을 통해 Iterable을 구현하고 다음을 수행한다는 사실을 활용할 수 있습니다. for (int n : integer) {ret [counter ++] = n; } ... 초기화 int counter = 0;
— gardarh

8
Java8에서 훨씬 쉬워졌습니다 :integers.stream().mapToInt(Integer::valueOf).toArray
— Manish Patel

241

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

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

그것이하는 일은 :

  • Stream<Integer>목록에서 가져 오기
  • IntStream각 요소를 자체에 매핑하여 (identity function) int각 Integer객체가 보유한 값을 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]

나는 이것이 double유형에 사용될 수 있다고 본다 . float유형에 해당하는 것이 없습니까?
— code_dredd

자세한 설명을 통해 Java 8의 이점을 살펴보십시오.
— 유진

이것이 바로 Java 8+ Stream API가 아름다운 이유입니다.
— Pranav A.

67

구글 구아바

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

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

6
나는 이것이 나에게 답이 될 것이라고 생각한다-나는 매일 복사-붙여 넣기 기능을 통해 라이브러리를 가져갈 것이다. 특히 적절한 크기의 프로젝트가 이미 사용하고있는 라이브러리. 이 답변이 향후 더 많은 투표와 가시성을 확보하기를 바랍니다.
— Sean Connolly

61

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이 보여 주었 듯이 외부 라이브러리를 사용하는 대신 혼자서이 작업을 수행하는 것이 매우 쉽습니다.


2
이 방법은 두 개의 완전한 시퀀스 사본을 만듭니다. 하나는 toArray로 만든 Integer []와 toPrimitive 안에는 int []입니다. Jon의 다른 대답은 하나의 배열 만 작성하고 채 웁니다. 큰 목록이 있고 성능이 중요한 경우 고려해야 할 사항입니다.
— paraquat

ArrayUtils vs pure java를 사용하여 성능을 측정했으며 작은 목록 (<25 요소)에서 pure java가 100 배 이상 빠릅니다. 3k 요소의 경우 순수 Java는 여전히 거의 2 배 빠릅니다 ... (ArrayList <Integer>-> int [])
— Oskar Lund

@paraquat & Oskar Lund 실제로는 정확하지 않습니다. 예, 제공된 코드는 두 개의 배열을 생성하지만이 방법 은 그렇지 않습니다. 이 코드의 문제점은 길이가 0 인 배열을 인수로 사용하는 것입니다. ArrayList.toArray 소스 코드의 내용이 맞는 경우, 원의 배열이 사용됨을 나타낸다. 공정한 비교 에서이 방법이 효율적이고 (더 많지 않은 경우) 유지해야 할 코드가 적다는 것을 알 수 있습니다.
— Sean Connolly


1
새로운 정수의 목적은 무엇입니까 [0]?
— Adam Hughes

41

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

6

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

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

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


1
이봐, 내가 전에 달러를 보지 못했다고 말하고 싶었지만 다음 프로젝트에서 분명히 시도해보고있다. 그것은 당신이 거기에가는 멋진 작은 api입니다, 좋은 일을 계속 :)
— 바트 Vandendriessche

4

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

에서 찾을 수 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));
    }
}

3

Apache Commons와 같이 완벽하게 잘 사용되는 라이브러리가 이미 문제를 해결했을 때마다 일회성 사용자 정의 방법을 권장한다는 것은 당황합니다. 이 솔루션이 터무니없는 것은 사소한 것이지만 장기적인 유지 관리 및 접근성으로 인해 그러한 행동을 장려하는 것은 무책임합니다.

그냥 Apache Commons 와 함께 가십시오


7
나는 이전의 논평자에 동의합니다. Apache Commons에서 드래그 할뿐만 아니라 드래그 할 필요가있는 많은 전이 종속성으로 쉽게 변환 할 수 있습니다. 최근에 한 줄의 코드를 대체하여 놀라운 수의 종속성을 제거 할 수있었습니다. 이와 같은 기본 코드를 작성하는 것이 좋습니다
— Peter Kriens

1
@PeterKriens와 동의 함. 표준 데이터 유형에서 이와 같은 간단한 변환을 지원하지 않는 결함은 Java에 있습니다
— Adam Hughes

3

당신이 사용하는 경우 이클립스 컬렉션 , 당신은 사용할 수있는 collectInt()원시적 INT 컨테이너에 객체 컨테이너에서 스위치에 방법을.

List<Integer> integers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
MutableIntList intList =
  ListAdapter.adapt(integers).collectInt(i -> i);
Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, intList.toArray());

당신이 당신을 변환 할 수 있습니다 경우 ArrayListA를 FastList, 당신은 어댑터를 제거 얻을 수 있습니다.

Assert.assertArrayEquals(
  new int[]{1, 2, 3, 4, 5},
  Lists.mutable.with(1, 2, 3, 4, 5)
    .collectInt(i -> i).toArray());

참고 : 저는 Eclipse 컬렉션의 커미터입니다.


3

자바 8 :

int[] intArr = Arrays.stream(integerList).mapToInt(i->i).toArray();

2

Arrays.setAll ()

    List<Integer> x = new ArrayList<>(Arrays.asList(7, 9, 13));
    int[] n = new int[x.size()];
    Arrays.setAll(n, x::get);

    System.out.println("Array of primitive ints: " + Arrays.toString(n));

산출:

기본 정수의 배열 : [7, 9, 13]

의 배열에 대해 동일한 작품 long이나 double,하지만의 배열 boolean, char, byte, short또는 float. 정말 큰 목록이 있다면 parallelSetAll대신 사용할 수 있는 방법이 있습니다.

나에게 이것은 외부 라이브러리를 얻거나 스트림을 사용하고 싶지 않을 정도로 훌륭하고 우아합니다.

설명서 링크 : Arrays.setAll(int[], IntUnaryOperator)


1

간단히 배열로 복사하면됩니다 :

int[] arr = new int[list.size()];
for(int i = 0; i < list.size(); i++) {
    arr[i] = list.get(i);
}

너무 화려하지는 않습니다. 그러나, 그것은 작동합니다 ...


1

매우 간단한 한 줄 솔루션은 다음과 같습니다.

Integer[] i = arrlist.stream().toArray(Integer[]::new);

0

이 코드 세그먼트는 나를 위해 노력하고 있습니다.

Integer[] arr = x.toArray(new Integer[x.size()]);

ArrayList는 다음과 같이 선언해야합니다.

ArrayList<Integer> list = new ArrayList<>();

5
안녕하십니까, OP는 Object 배열이 아닌 기본 배열을 원한다는 것을 상기시켜줍니다.
— OLIVER.KOO

3
기본 정수는 래퍼가 아닌 정수입니다!
— Bartzilla

-4
   List<Integer> list = new ArrayList<Integer>();

    list.add(1);
    list.add(2);

    int[] result = null;
    StringBuffer strBuffer = new StringBuffer();
    for (Object o : list) {
        strBuffer.append(o);
        result = new int[] { Integer.parseInt(strBuffer.toString()) };
        for (Integer i : result) {
            System.out.println(i);
        }
        strBuffer.delete(0, strBuffer.length());
    }

1
이 답변은 작동하지 않으며 여러 요소 대신 단일 요소가있는 배열을 반환합니다.
— 신비주의

왜 StringBuffer를 사용합니까? 정수를 문자열로 변환 한 다음 정수로 변환 한 다음 정수로 변환 한 다음 다시 정수로 변환하는 이유는 무엇입니까? 단일 요소가 포함 된 배열을 사용하는 이유는 하나의 요소 만 포함 된 단일 요소 배열을 반복하는 이유는 무엇입니까? 왜 외부 루프에서 정수를 객체로 캐스트합니까? 여기에는 많은 질문이 있습니다. @CodeMadness는 트롤 계정입니까?
— Victor Zamanian

-5
Integer[] arr = (Integer[]) x.toArray(new Integer[x.size()]);

arrnormal처럼 접근하십시오 int[].


5
이것은 질문에 대답하지 않습니다. 문제는 원시 유형 (int)으로 변환하는 것에 관한 것이 었습니다
— Asaf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.