programing

Java에서 List를 int[]로 변환하려면 어떻게 해야 합니까?

coolbiz 2022. 7. 7. 23:43
반응형

Java에서 List를 int[]로 변환하려면 어떻게 해야 합니까?

자바에 처음 와봐요.「 」를 해야 ?List<Integer>로로 합니다.int[]★★★★★★★★★★★★★★★★★?

헷갈리네요.List.toArray()는 실제로 「」를 합니다.Object[]할 수 Integer[] 않다int[].

지금은 루프를 사용하여 그렇게 하고 있습니다.

int[] toIntArray(List<Integer> list) {
  int[] ret = new int[list.size()];
  for(int i = 0; i < ret.length; i++)
    ret[i] = list.get(i);
  return ret;
}

더 좋은 방법이 있을까요?

이것은 Java에서 int[]를 Integer[]로 변환하는 방법과 비슷합니다.

Java 8에는 아직 스트림이 추가되지 않았습니다.다음은 예를 제시하겠습니다.

int[] example1 = list.stream().mapToInt(i->i).toArray();
// OR
int[] example2 = list.stream().mapToInt(Integer::intValue).toArray();

사고 과정:

  • 한 ★★★★★Stream#toArrayObject[]이치노ㅇㅇㅇㅇ.Stream#toArray(IntFunction<A[]> generator)이 안 맞아서 싶은 안 돼요. 왜냐하면 범용 타입은A을 수 int

  • 수 것 요.int Integer 이유는 '그것'이기 때문입니다toArray될 수 .int[]어레이 등)Object[] 상자에 넣어두기도 한다.Integer[]여기서 부자연스러울 거야)그리고 다행히도 Java 8에는 이러한 스트림이 있습니다.

  • 그래서 이제 할 해야 하는가 이다.Stream<Integer>(은 (에서)list.stream() 반짝반짝 빛나다IntStream여기 구조 방법이 있습니다.우리가 해야 할 일은 그 지도만 건네주면 돼Integer로로 합니다.int.

    이런 걸 쓰면...int다음과 같이 합니다.

    mapToInt( (Integer i) -> i.intValue() )  
    

    어떤 은 다음을 선호할 수 .mapToInt(Integer::intValue)

    이 람다의 을 사용하여 될 수 은 컴파일러가 이 의 결과가 unboxing의 있기 때문입니다.int mapToInt의 실장입니다.ToIntFunction과 같은 :int applyAsInt(T value)는 ", ", "를 해야 합니다.int를 참조해 주세요.

    간단하게 다음과 같이 쓸 수 있습니다.

    mapToInt((Integer i)->i)
    

    「 」이래, 「 」이래, 「 」이래,Integer를 치다(Integer i)할 수 .List<Integer>#stream()를 반환하다Stream<Integer>도 있고, 그냥 넘어갈 수도 있어요.

    mapToInt(i -> i)
    

유감스럽게도 자바가 원시 타입, 박스, 어레이 및 제네릭을 처리하는 특성 때문에 더 나은 방법은 없다고 생각합니다.특히:

  • List<T>.toArray안 안 된다Integer로로 합니다.int
  • 하면 안 요.int제네릭스를 위한 형식적인 논쟁으로서, 그래서 그것은 하나의 논리여야 할 이다.int- 방식 속임수를 한 방식 「 」( 「 」 또또 ) ) 。

모든 원시 유형에 대해 이러한 종류의 메서드를 자동으로 생성하는 라이브러리가 있다고 생각합니다(즉, 유형별로 복사되는 템플릿이 있습니다).못생겼지만, 유감스럽게도 그런 것 같습니다.

클래스는 제네릭이 Java에 도착하기 전에 나왔지만, 오늘날 도입된다면(원시 어레이를 사용하고 싶다고 가정할 때) 여전히 모든 끔찍한 오버로드를 포함해야 합니다.

Commons Lang 이외에도 Guava의 메서드로 이를 수행할 수 있습니다.

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

이것에 의해, Commons Lang에 상당하는 어레이의 중간 변환을 스스로 실시할 필요가 없어집니다.

가장 쉬운 방법은 Apache Commons Lang을 사용하는 것입니다.원하는 작업을 수행할 수 있는 편리한 Array Utils 클래스가 있습니다.다음 배열에 대해 오버로드와 함께 메서드를 사용합니다.Integers.

List<Integer> myList;
 ... assign and fill the list
int[] intArray = ArrayUtils.toPrimitive(myList.toArray(new Integer[myList.size()]));

이렇게 하면 바퀴를 재창조할 수 없습니다.Commons Lang은 Java가 빠뜨린 유용한 것들을 많이 가지고 있다.위에서 적절한 크기의 Integer 목록을 작성했습니다.또한 0 길이의 정적 정수 배열을 사용하여 Java가 적절한 크기의 배열을 할당할 수도 있습니다.

static final Integer[] NO_INTS = new Integer[0];
   ....
int[] intArray2 = ArrayUtils.toPrimitive(myList.toArray(NO_INTS));

Java 8은 스트림을 통해 이를 쉽게 수행할 수 있는 방법을 제공합니다.

stream()ints(IntStream) IntStream(Ints)IntStream하면 Array()를 얻을 수 .int []

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

[]에 []

IntStream으로

int[] toIntArray(List<Integer> list)  {
    int[] ret = new int[list.size()];
    int i = 0;
    for (Integer e : list)  
        ret[i++] = e;
    return ret;
}

값비싼 목록 인덱싱을 피하기 위해 코드를 약간 변경합니다(목록은 반드시 ArrayList는 아니지만 링크된 목록일 수 있으므로 랜덤 액세스 비용이 많이 듭니다).

이것은 Java 8의 한 줄 코드입니다.

public int[] toIntArray(List<Integer> intList){
       return intList.stream().mapToInt(Integer::intValue).toArray();
}

" " " 를 Integer int매핑 로직은 범위 밖의 변수에 의존하지 않으므로 병렬 처리를 고려해야 합니다.

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

이것만 알아두세요.

병렬 처리가 시리얼 조작보다 자동적으로 고속인 것은 아닙니다.다만, 데이터와 프로세서 코어가 충분한 경우는, 병렬 처리가 자동적으로 고속인 것은 아닙니다.Aggregate Operations를 사용하면 병렬 처리를 보다 쉽게 구현할 수 있지만, 애플리케이션이 병렬 처리에 적합한지 판단하는 것은 여전히 사용자의 책임입니다.


정수를 원시 형태로 매핑하는 방법에는 두 가지가 있습니다.

  1. 경유ToIntFunction.

    mapToInt(Integer::intValue)
    
  2. 람다 표현과 함께 명시적인 언박스를 통해.

    mapToInt(i -> i.intValue())
    
  3. 람다 식을 사용한 암시적(자동) 언박스를 통해.

    mapToInt(i -> i)
    

리스트와 함께null가치

List<Integer> list = Arrays.asList(1, 2, null, 4, 5);

다음 세 가지 옵션을 사용할 수 있습니다.null:

  1. .null값을 지정합니다.

    int[] arr = list.parallelStream().filter(Objects::nonNull).mapToInt(Integer::intValue).toArray();
    
  2. 를 매핑합니다.null기본값으로 설정합니다.

    int[] arr = list.parallelStream().map(i -> i == null ? -1 : i).mapToInt(Integer::intValue).toArray();
    
  3. ★★null을 사용하다

    int[] arr = list.parallelStream().mapToInt(i -> i == null ? -1 : i.intValue()).toArray();
    

이 간단한 루프는 항상 정확합니다! 버그 없음

  int[] integers = new int[myList.size()];
  for (int i = 0; i < integers.length; i++) {
      integers[i] = myList.get(i);
  }

여기 하나 더 넣을게요.루프를 위한 용도는 몇 가지 있지만 루프 내부에는 아무것도 필요하지 않습니다.내가 이것을 언급하는 이유는 단지 원래의 질문이 덜 상세한 코드를 찾으려는 것이었기 때문이다.

int[] toArray(List<Integer> list) {
    int[] ret = new int[ list.size() ];
    int i = 0;
    for( Iterator<Integer> it = list.iterator(); 
         it.hasNext(); 
         ret[i++] = it.next() );
    return ret;
}

Java가 C++와 같이 for 루프에서 여러 선언을 허용했다면, 한 걸음 더 나아가서 (int i = 0, 반복자)에 대해 수행할 수 있습니다.

다만(이 부분은 제 의견일 뿐) 결국, 당신을 위해 무언가를 할 수 있는 도움의 기능이나 방법을 가지고 있다면, 그것을 설정하고 잊어버리세요.그것은 한 줄짜리일 수도 있고 열 줄짜리일 수도 있다; 만약 당신이 그것을 다시 보지 않는다면 당신은 차이를 모를 것이다.

toArray는 오브젝트[]를 반환하고 오브젝트[]에서int[] 또는 Integer[]에서int[]로 캐스트 할 수 없기 때문에, 실제로 실행하려고 하는 작업을 「한 줄」으로 하는 방법은 없습니다.

int[] ret = new int[list.size()];       
Iterator<Integer> iter = list.iterator();
for (int i=0; iter.hasNext(); i++) {       
    ret[i] = iter.next();                
}                                        
return ret;                              

달러도 시험해 보세요( 개정판을 체크하세요):

import static com.humaorie.dollar.Dollar.*
...

List<Integer> source = ...;
int[] ints = $(source).convert().toIntArray();

도 꼭 하시길 권해드립니다.List<?>Java collections API 입니다.

package mypackage;

import java.util.AbstractList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Test {

//Helper method to convert int arrays into Lists
static List<Integer> intArrayAsList(final int[] a) {
    if(a == null)
        throw new NullPointerException();
    return new AbstractList<Integer>() {

        @Override
        public Integer get(int i) {
            return a[i];//autoboxing
        }
        @Override
        public Integer set(int i, Integer val) {
            final int old = a[i];
            a[i] = val;//auto-unboxing
            return old;//autoboxing
        }
        @Override
        public int size() {
            return a.length;
        }
    };
}

public static void main(final String[] args) {
    int[] a = {1, 2, 3, 4, 5};
    Collections.reverse(intArrayAsList(a));
    System.out.println(Arrays.toString(a));
}
}

박스/언박스의 결점에 주의

Eclipse 컬렉션을 사용하여 유형 목록이 있는 경우 다음을 수행할 수 있습니다.java.util.List<Integer>:

List<Integer> integers = Lists.mutable.with(1, 2, 3, 4, 5);
int[] ints = LazyIterate.adapt(integers).collectInt(i -> i).toArray();

Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, ints);

와 같은 Eclipse 컬렉션 유형이 이미 있는 경우 다음을 수행할 수 있습니다.

MutableList<Integer> integers = Lists.mutable.with(1, 2, 3, 4, 5);
int[] ints = integers.asLazy().collectInt(i -> i).toArray();

Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, ints);

주의: 저는 Eclipse Collections의 커밋입니다.

lamda를 사용하면 다음과 같은 작업을 수행할 수 있습니다(jdk lamda의 컴파일).

public static void main(String ars[]) {
        TransformService transformService = (inputs) -> {
            int[] ints = new int[inputs.size()];
            int i = 0;
            for (Integer element : inputs) {
                ints[ i++ ] = element;
            }
            return ints;
        };

        List<Integer> inputs = new ArrayList<Integer>(5) { {add(10); add(10);} };

        int[] results = transformService.transform(inputs);
    }

    public interface TransformService {
        int[] transform(List<Integer> inputs);
    }

언급URL : https://stackoverflow.com/questions/960431/how-can-i-convert-listinteger-to-int-in-java

반응형