2008-10-08 4 views
6

컬렉션 셔플이 제대로 작동하지 않는 이유를 알 수 없기 때문에 매우 좌절하고 있습니다.컬렉션 API를 사용하여 셔플

randomizer 배열을 셔플하려고합니다.

int[] randomizer = new int[] {200,300,212,111,6,2332}; 
Collections.shuffle(Arrays.asList(randomizer)); 

은 어떤 이유로 요소 내가 셔플 메소드를 호출할지 여부를 동일한 정확히 분류를 유지. 어떤 아이디어?

+0

[이 중복] (http://stackoverflow.com/questions/3981420/collections-shuffle) – basZero

답변

18

Arrays.asList은 프리미티브 배열과 함께 사용할 수 없습니다. 대신를 사용

Integer[] randomizer = new Integer[] {200,300,212,111,6,2332}; 
Collections.shuffle(Arrays.asList(randomizer)); 

동일한 규칙이 있다는 점에서, 컬렉션 프레임 워크에있는 대부분의 클래스에 적용하면 기본 형식을 사용할 수 없습니다. (int[]와)

원래의 코드를 잘 컴파일,하지만 의도 한대로 때문에 가변 방법 asList의 행동, 작동하지 않았다 : 그것은 단지 하나의 요소 목록을 만들고, 유일한 구성원으로 int 배열.

+0

도 참조하십시오. 문제는 목록이 정렬되지만 원래 배열은 아니라고 생각했지만 Arrays.asList의 javadocs는 목록에서 기본 배열을 사용한다고 말합니다. 이 목록이 커지면 문제가 발생합니다! (어레이는 새로운 배열로 대체 될 것입니다) –

+0

명확한 설명을 주셔서 감사합니다 – VeePee

+0

Lovely ... Autoboxing/Unboxing이 예상대로 작동하지 않는 또 다른 경우 (또는이 경우 단순히 적용되지 않음). –

0

Chris '대답이 맞습니다.

Chris 응답에 대한 의견에서 말했듯이, arraylist가 커질 필요가 없으면 기본 배열이 적절하게 변경되고 목록은 새로운 배열을 만들고 항목을 복사합니다.

목록에 대한 참조를 유지하고 Arrays.asList 호출 다음에 반복하여 반복 할 수 있으며 그 후에 배열을 반복하지 않고 대신 목록을 반복합니다.

+0

내 대답은 정확하지만 불행히도 당신은 그렇지 않습니다. :-('Arrays.asList'에서 반환 된리스트는'java.util.Arrays $ ArrayList' 타입이고'java.util.ArrayList'와 달리 사이즈를 재조정 할 수 없습니다 (시도 할 때'UnsupportedOperationException'가 발생합니다). 돌려 주어지는리스트는, 지정된 배열에 의해 항상 뒷받침됩니다. –