Why does my code not work?
package generatingInitialPopulation; import java.util.Arrays; import java.util.Collections; public class TestShuffle { public static void main(String[] args) { int[] arr = new int[10]; for (int i = 0; i < arr.length; i++) { arr[i] = i; } Collections.shuffle(Arrays.asList(arr)); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } }
The result is: 0 1 2 3 4 5 6 7 8 9.
I was expecting a randomly shuffled sequence.
Shuffle Array using Random Class We can iterate through the array elements in a for loop. Then, we use the Random class to generate a random index number. Then swap the current index element with the randomly generated index element. At the end of the for loop, we will have a randomly shuffled array.
shuffle() method of Collections class as the class name suggests is present in utility package known as java. util that shuffles the elements in the list.
The shuffle() is a Java Collections class method which works by randomly permuting the specified list elements. There is two different types of Java shuffle() method which can be differentiated depending on its parameter.
In order to shuffle elements of ArrayList with Java Collections, we use the Collections. shuffle() method.
Arrays.asList()
can't be applied to arrays of primitive type as you expect. When applied to int[]
, Arrays.asList()
produces a list of int[]
s instead of list of Integer
s. Therefore you shuffle a newly created list of int[]
.
This is a subtle behaviour of variadic arguments and generics in Java. Arrays.asList()
is declared as
public static <T> List<T> asList(T... a)
So, it can take several arguments of some type T
and produce a list containing these arguments, or it can take one argument of type T[]
and return a list backed by this array (that's how variadic arguments work).
However, the latter option works only when T
is a reference type (i.e. not a primitive type such as int
), because only reference types may be used as type parameters in generics (and T
is a type parameter).
So, if you pass int[]
, you get T
= int[]
, and you code doesn't work as expected. But if you pass array of reference type (for example, Integer[]
), you get T
= Integer
and everything works:
Integer[] arr = new Integer[10]; for (int i = 0; i < arr.length; i++) { arr[i] = i; } Collections.shuffle(Arrays.asList(arr)); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With