programing

정수를 포함하는 ArrayList를 원시 int 배열로 변환하는 방법

goodcopy 2022. 7. 5. 23:06
반응형

정수를 포함하는 ArrayList를 원시 int 배열로 변환하는 방법

Integer 객체를 포함하는 ArrayList를 다음 코드 조각으로 primitive int[]로 변환하려고 하는데 컴파일 시간 오류가 발생합니다.자바 변환이 가능합니까?

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

을 사용하는 경우 다른 방법도 있습니다.

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

기능:

  • 취득Stream<Integer>명단에서
  • 취득IntStream각 요소를 그 자체에 매핑함으로써(메모함수), 포장을 해제하고int각자가 가지는 가치Integer오브젝트(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]

변환은 가능하지만 자동으로 변환하기 위한 기본 제공 기능은 없는 것 같습니다.

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

(Null Pointer가 느려지는 것에 주의해 주십시오.다음 중 하나일 경우 예외integers또는 그 안에 있는 어떤 요소도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;
}

구글 구아바

Google Guava는 를 호출하여 이를 수행하는 깔끔한 방법을 제공합니다.

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

Apache Commons에는 Array Utils 클래스가 있습니다.이 클래스는 정확하게 이 작업을 수행하는 Primitive() 메서드를 가지고 있습니다.

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)는, 리스트의 실장에 의해서 퍼포먼스가 저하하는 경우가 있습니다.

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

Java 8:

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

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

출력:

원시 int 배열: [7, 9, 13]

동일한 기능을 일련의 시스템에 대해long또는double, 단, 어레이의 경우boolean,char,byte,short또는float정말 엄청난 양의 리스트가 있다면parallelSetAll대신 사용할 수 있는 방법입니다.

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

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

달러 사용은 매우 간단해야 합니다.

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

DSL을 개량하여 중간을 제거할 계획입니다.toArray()불러

이것은 나에게 도움이 된다:)

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

Arrays.setAll()은 대부분의 시나리오에서 작동합니다.

  1. 원시 int 어레이에 대한 정수 목록:

    public static int[] convert(final List<Integer> list)
    {
       final int[] out = new int[list.size()];
       Arrays.setAll(out, list::get);
       return out;
    }
    
  2. 원시 int 배열에 대한 정수 목록(문자열):

    public static int[] convert(final List<String> list)
    {
       final int[] out = new int[list.size()];
       Arrays.setAll(out, i -> Integer.parseInt(list.get(i)));
       return out;
    }
    
  3. 원시 int 어레이에 대한 정수 배열:

    public static int[] convert(final Integer[] array)
    {
       final int[] out = new int[array.length];
       Arrays.setAll(out, i -> array[i]);
       return out;
    }
    
  4. Primitic int 배열에서 Integer 배열로:

    public static Integer[] convert(final int[] array)
    {
       final Integer[] out = new Integer[array.length];
       Arrays.setAll(out, i -> array[i]);
       return out;
    }
    

Apache Commons와 같이 완벽하게 훌륭하고 잘 사용되는 라이브러리가 이미 문제를 해결했을 때 우리가 일회성 맞춤 방식을 장려하는 것은 나를 혼란스럽게 한다.터무니없지는 않더라도 사소한 해결책이지만 장기적인 유지보수와 접근성 때문에 이런 행동을 조장하는 것은 무책임한 행동이다.

Apache Commons를 선택하기만 하면 됩니다.

Eclipse 컬렉션을 사용하는 경우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());

「 」를 할 수 ArrayList a까지FastList떼면

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

주의: 저는 이클립스 컬렉션의 커밋입니다.

어레이에 복사하기만 하면 됩니다.

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

너무 화려하진 않지만, 그래도...

다음 행은 int [] -> List -> int [ ]에서 변환할 수 있습니다.

   private static int[] convert(int[] arr) {
        List<Integer> myList=new ArrayList<Integer>();
        for(int number:arr){
               myList.add(number);
            }
        }
        int[] myArray=new int[myList.size()];
        for(int i=0;i<myList.size();i++){
           myArray[i]=myList.get(i);
        }
        return myArray;
    }

자바 8

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

OR 

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

이 코드 세그먼트를 사용할 수 있습니다.이것을 사용해 주세요.

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

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

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

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

Integer[] i = arrlist.stream().toArray(Integer[]::new);
   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());
    }
Integer[] arr = (Integer[]) x.toArray(new Integer[x.size()]);

arr int[].

언급URL : https://stackoverflow.com/questions/718554/how-to-convert-an-arraylist-containing-integers-to-primitive-int-array

반응형