Quote (Minkomonster @ 20 Jan 2015 22:09)
It doesn't work perfectly though. It gives you a randomized list, but that list is not based on the order of randomSet like you asked. To do this you would need a bit more memory for storage. You could do something like this:
Code
//capture list's original size
int originalSize = list.size();
//LinkedHashSet iterator() is guaranteed to be ordered
Iterator<Integer> iterator = randomSet.iterator();
for(int i = 0; iterator.hasNext(); i++)
{
int j = iterator.next();
E temp = list.get(j);
//add a copy of the selected element to the end of this ArrayList
list.add(temp);
}
for(int i = 0; i < originalSize; i++ )
{
//remove the original order at the beginning of this ArrayList
list.remove(0);
}
It's pretty silly.
I should rephrase, it worked like this:
Code
public static <E> void shuffle (ArrayList<E> list){
int n = list.size();
Random rgen = new Random();
LinkedHashSet<Integer> randomSet = new LinkedHashSet<Integer>();
while (randomSet.size() < list.size()) {
int next = rgen.nextInt(list.size());
randomSet.add(next);
}
Iterator<Integer> iterator = randomSet.iterator();
for(int i = 0; iterator.hasNext(); i++)
{
int j = iterator.next();
E temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
}
}
Before Shuffle:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
After Shuffle:
[4, 2, 5, 1, 8, 7, 6, 0, 9, 3]
Thats the print statement, and after shuffle changes every time