views:

453

answers:

2

I am getting very frustrated because I cannot seem to figure out why Collections shuffling is not working properly.

Lets say that I am trying to shuffle the 'randomizer' array.

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

For some reason the elements stay sorted exactly the same whether or not I call the shuffle method. Any ideas? Thanks in advance.

+13  A: 

Arrays.asList cannot be used with arrays of primitives. Use this instead:

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

The same rule applies to most classes in the collections framework, in that you can't use primitive types.

The original code (with int[]) compiled fine, but did not work as intended, because of the behaviour of the variadic method asList: it just makes a one-element list, with the int array as its only member.

Chris Jester-Young
good catch! i was thinking the problem was that the list would be sorted, but not the original array, but the javadocs in Arrays.asList says that the list uses the underlying array.If you grow this list you will have a problem though! (the array will get replaced with a new array)
John Gardner
thank you for the clear explanation
outsyncof
Lovely... another case where Autoboxing/Unboxing doesn't work as expected (or in this case, simply doesn't apply).
James Schek
I think Josh Bloch has said that it was a mistake to use ... on asList for this very reason.
Tom Hawtin - tackline
+1  A: 

Chris' answer is correct.

As i said in a comment on Chris' answer, your underlying array will change appropriately unless the arraylist needs to grow, and the list creates a new one and copies items into it.

You may want to keep a reference to the list and iterate over that after the Arrays.asList call, and not iterate over the array after that, iterate over the List instead.

John Gardner