2008-10-08 5 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 2011-11-01 07:36:46

ответ

18

Arrays.asList не может использоваться с массивами примитивов. Используйте вместо этого:

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

То же правило относится и к большинству классов в рамках коллекций, в том, что вы не можете использовать примитивные типы.

Исходный код (с int[]) компилируется нормально, но не работает, как предполагалось, из-за поведения VARIADIC метода asList: он просто делает список, состоящий из одного элемента, с int массив в качестве единственного члена.

+0

хороший улов! Я думал, проблема в том, что список будет отсортирован, но не исходный массив, но javadocs в Arrays.asList говорит, что в списке используется базовый массив. Если вы вырастите этот список, у вас будет проблема! (массив будет заменен новым массивом) – 2008-10-08 00:58:30

+0

Благодарим вас за ясное объяснение – VeePee 2008-10-08 05:30:17

0

Ответ Криса верен.

Как я уже сказал в комментарии к ответу Криса, ваш базовый массив изменится соответствующим образом, если аррайалист не должен расти, а список создает новый и копирует в него элементы.

Возможно, вы захотите сохранить ссылку на список и перебрать его после вызова Arrays.asList, а затем не перебирать массив после этого, вместо этого перебирать список.