정수를 포함하는 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) 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]

나는 이것이 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.