2010-03-15 2 views

답변

18

아파치의 ArrayUtils이있다 (여전히 behind the scenes을 반복 할) :

doSomething(ArrayUtils.toPrimitive(hashset.toArray())); 

그들은 항상이 같은 것을 확인하기에 좋은 장소입니다.

+2

자동으로 Apache Commons를 추천합니다. – skaffman

+0

@skaffman Apache Commons Lang을 추천합니다 ...하지만이 특별한 문제는 아닙니다 ... 어쨌든, 이동하십시오;) – sfussenegger

+0

사실, 장면 뒤에서 반복하지 않습니다. 두 번 반복됩니다. 컬렉션에서 프리미티브 배열을 만드는 프로세스를 느리게하는 불필요한'Integer [] '가 있습니다. 사실, 'Iterable '대신'toPrimitive (..) '에 대한 매개 변수로 Integer []를 사용하는 선택은 다소 복잡합니다. Arrays.asList (Integer [])는 훨씬 빠른 작업입니다. 'collection.toArray()'. 따라서 나는 자동으로 아파치 커먼즈를 추천하는 것에 +1하지 않을 것이다. – sfussenegger

2

아니처럼 캐스팅하려고해도, 개체 [] 배열을 허용하지 않습니다

void doSomething(int[] arr) 

에 배열을 전달하려는; 당신은 그들을 반복해야합니다. 죄송합니다.

+0

생각해 보면 이해할 수 있습니다. int는 객체가 아니므로 하나를 다른 것으로 형변환하면 작동하지 않습니다. –

+1

정수의 HashSet에서 정수 배열을 얻을 수 없다는 것이 이상하게 보입니다. autoboxing이 실행되어서는 안되며 그렇게 할 수 있습니까? 그것은 HashSet이 유형의 혼합을 포함하는 것과는 다르다. 그것들은 모두 정수이므로 (내가 볼 수있는 한) 문제가되지는 않는다. – jackbot

+2

컬렉션은 개체 만 보유 할 수 있습니다 (귀하의 경우에는 정수). 따라서, int의 배열을 얻는 특별한 메소드를 가지는 것은 이상 할 것입니다 (대응하는 메소드는 다른 원시 타입에 필요합니다). 자동 복싱은 단일 원시 <-> 개체 변환에만 적용되기 때문에 도움이되지 않습니다. 타입 삭제 때문에 실제 클래스는 HashSet (컴파일 타임 개념 만)이 아니라 HashSet입니다. –

4
public int[] toInt(Set<Integer> set) { 
    int[] a = new int[set.size()]; 
    int i = 0; 
    for (Integer val : set) a[i++] = val; 
    return a; 
} 

이제 코드를 작성 했으므로이 설명서가 더 이상 필요하지 않습니까? ;)

+3

수동으로 코드를 작성하는 것이 문제가 아니 었습니다. 더 나은 것이 있는지 궁금했습니다. 그것을하는 방법. – jackbot

+0

글쎄, 내 답변의 핵심은이 코드를 작성하는 것을 피할 수있는 유일한 방법은 다른 사람들에게 글을 쓰게하는 것이다. (실제로는 어떤 코드에 대해서도 그렇다.) - – sfussenegger

+0

null에 넣을 수 있습니까? 을 설정 하시겠습니까? 그렇다면이 코드는 NPE입니다. 나는 원래의 포스터가 null로 무엇을하고 싶어할지 확실하지 않다. 결과 배열에서 그들을 생략하는 것 같아요. – davidsheldon

-4

toArray() 메서드의 toArray (T [] 내용) 변형을 사용할 수도 있습니다. HashSet의 같은 크기의 int 치의 빈 배열을 만든 다음 toArray() 메소드에 전달 :

Integer[] myarray = new Integer[hashset.size()]; 
doSomething(hashset.toArray(myarray)); 

대신 int[]Integer[] 배열을 허용하도록 doSomething() 기능을 변경해야 할 것입니다. 가능하지 않은 경우 toArray에 의해 반환 된 값 배열을 int[]으로 변환해야합니다.

+1

아니, 컴파일되지 않습니다. – jkff

+0

컴파일 오류를 제공하면 코드에 어떤 문제가 있는지 알 수 있습니다. – Shiprack

+2

왜 직접 컴파일하지 않으시겠습니까? 컴파일 오류가 나타나면 왜 그런 일이 일어 났는지 설명 할 수 있습니다. – jkff

3

는 당신은 아파치의 Utils없이 Set<Integer>Integer[]에 변환 할 수 있습니다 :

Set<Integer> myset = new HashSet<Integer>(); 
Integer[] array = myset.toArray(new Integer[0]); 

을하지만, 당신이 세트를 반복해야 int[]이 필요합니다.

4

당신은 구아바의 사용할 수 있습니다 :

Ints.toArray(Collection<? extends Number> collection) 
8

당신은 어떤 Collection<Integer>에서 int[]을 만들 수있는 Java 8 스트림 사용 (A 포함) : 라이브러리는 여전히 컬렉션 반복되는

int[] array = coll.stream().mapToInt(Number::intValue).toArray(); 

을 (또는 다른 스트림 소스)를 대신 사용할 수 있습니다.

간결하고 외부 라이브러리 종속성이없는 것 외에도 스트림을 사용하면 복사 할 수있는 큰 콜렉션이 있으면 병렬 처리 할 수도 있습니다.

+0

좀 더 간결하게 : int [] array = coll.stream(). mapToInt (x -> x) .toArray() – HammerNL

관련 문제