나는 Integers
의 무리와 함께 을 얻었습니다. 배열로 바꾸고 싶지만 호출은Java HashSet <Integer>을 원시 int 배열로 변환하려면 어떻게해야합니까?
hashset.toArray();
Object[]
을 반환합니다. 수동으로 모든 요소를 반복하는 것 외에 int
배열로 캐스팅하는 더 좋은 방법이 있습니까? 나는
doSomething((int[]) hashSet.toArray());
나는 Integers
의 무리와 함께 을 얻었습니다. 배열로 바꾸고 싶지만 호출은Java HashSet <Integer>을 원시 int 배열로 변환하려면 어떻게해야합니까?
hashset.toArray();
Object[]
을 반환합니다. 수동으로 모든 요소를 반복하는 것 외에 int
배열로 캐스팅하는 더 좋은 방법이 있습니까? 나는
doSomething((int[]) hashSet.toArray());
아파치의 ArrayUtils이있다 (여전히 behind the scenes을 반복 할) :
doSomething(ArrayUtils.toPrimitive(hashset.toArray()));
그들은 항상이 같은 것을 확인하기에 좋은 장소입니다.
아니처럼 캐스팅하려고해도, 개체 [] 배열을 허용하지 않습니다
void doSomething(int[] arr)
에 배열을 전달하려는; 당신은 그들을 반복해야합니다. 죄송합니다.
생각해 보면 이해할 수 있습니다. int는 객체가 아니므로 하나를 다른 것으로 형변환하면 작동하지 않습니다. –
정수의 HashSet에서 정수 배열을 얻을 수 없다는 것이 이상하게 보입니다. autoboxing이 실행되어서는 안되며 그렇게 할 수 있습니까? 그것은 HashSet이 유형의 혼합을 포함하는 것과는 다르다. 그것들은 모두 정수이므로 (내가 볼 수있는 한) 문제가되지는 않는다. – jackbot
컬렉션은 개체 만 보유 할 수 있습니다 (귀하의 경우에는 정수). 따라서, int의 배열을 얻는 특별한 메소드를 가지는 것은 이상 할 것입니다 (대응하는 메소드는 다른 원시 타입에 필요합니다). 자동 복싱은 단일 원시 <-> 개체 변환에만 적용되기 때문에 도움이되지 않습니다. 타입 삭제 때문에 실제 클래스는 HashSet
public int[] toInt(Set<Integer> set) {
int[] a = new int[set.size()];
int i = 0;
for (Integer val : set) a[i++] = val;
return a;
}
이제 코드를 작성 했으므로이 설명서가 더 이상 필요하지 않습니까? ;)
수동으로 코드를 작성하는 것이 문제가 아니 었습니다. 더 나은 것이 있는지 궁금했습니다. 그것을하는 방법. – jackbot
글쎄, 내 답변의 핵심은이 코드를 작성하는 것을 피할 수있는 유일한 방법은 다른 사람들에게 글을 쓰게하는 것이다. (실제로는 어떤 코드에 대해서도 그렇다.) - – sfussenegger
null에 넣을 수 있습니까?
toArray() 메서드의 toArray (T [] 내용) 변형을 사용할 수도 있습니다. HashSet의 같은 크기의 int 치의 빈 배열을 만든 다음 toArray() 메소드에 전달 :
Integer[] myarray = new Integer[hashset.size()];
doSomething(hashset.toArray(myarray));
대신 int[]
의 Integer[]
배열을 허용하도록 doSomething()
기능을 변경해야 할 것입니다. 가능하지 않은 경우 toArray
에 의해 반환 된 값 배열을 int[]
으로 변환해야합니다.
는 당신은 아파치의 Utils없이 Set<Integer>
Integer[]
에 변환 할 수 있습니다 :
Set<Integer> myset = new HashSet<Integer>();
Integer[] array = myset.toArray(new Integer[0]);
을하지만, 당신이 세트를 반복해야 int[]
이 필요합니다.
당신은 구아바의 사용할 수 있습니다 :
Ints.toArray(Collection<? extends Number> collection)
당신은 어떤 Collection<Integer>
에서 int[]
을 만들 수있는 Java 8 스트림 사용 (A 포함) : 라이브러리는 여전히 컬렉션 반복되는
int[] array = coll.stream().mapToInt(Number::intValue).toArray();
을 (또는 다른 스트림 소스)를 대신 사용할 수 있습니다.
간결하고 외부 라이브러리 종속성이없는 것 외에도 스트림을 사용하면 복사 할 수있는 큰 콜렉션이 있으면 병렬 처리 할 수도 있습니다.
좀 더 간결하게 : int [] array = coll.stream(). mapToInt (x -> x) .toArray() – HammerNL
자동으로 Apache Commons를 추천합니다. – skaffman
@skaffman Apache Commons Lang을 추천합니다 ...하지만이 특별한 문제는 아닙니다 ... 어쨌든, 이동하십시오;) – sfussenegger
사실, 장면 뒤에서 반복하지 않습니다. 두 번 반복됩니다. 컬렉션에서 프리미티브 배열을 만드는 프로세스를 느리게하는 불필요한'Integer [] '가 있습니다. 사실, 'Iterable'대신'toPrimitive (..) '에 대한 매개 변수로 Integer []를 사용하는 선택은 다소 복잡합니다. Arrays.asList (Integer [])는 훨씬 빠른 작업입니다. 'collection.toArray()'. 따라서 나는 자동으로 아파치 커먼즈를 추천하는 것에 +1하지 않을 것이다. –
sfussenegger