我们想实现洗牌,其实很简单,不用自己再另外编一个方法,只需调用java.util.Collections中的shuffle(Collection <?>list)这个方法即可。
下面举个简单的例子来说明它的简便性。
package package2;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main
{
public static void display()
{
List arr=new ArrayList();
//Collection arr=new ArrayList();
for(int i=0;i<10;i++)
arr.add(i);
System.out.println(“元素原始数据”+arr);
for(int i=0;i<5;i++)
{
Collections.shuffle(arr);//调用Collections中的shuffle方法
//该方法能把数组里的元素乱序,从而实现洗牌
//shuffle(list)方法能把list中的元素以随机方式重组
System.out.println("第"+(i+1)+"次洗牌后的数据"+arr);
}
}
public static void main(String[] args) throws Exception
{
display();
}
}
运行结果:
//--------------------------------
元素原始数据[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
第1次洗牌后的数据[8, 4, 5, 6, 3, 2, 9, 1, 0, 7]
第2次洗牌后的数据[9, 3, 0, 5, 8, 2, 6, 4, 7, 1]
第3次洗牌后的数据[7, 6, 4, 5, 0, 3, 9, 2, 8, 1]
第4次洗牌后的数据[8, 3, 0, 5, 9, 1, 4, 2, 7, 6]
第5次洗牌后的数据[6, 5, 3, 4, 9, 1, 2, 8, 0, 7]
//--------------------------------
下面来看看shuffle(List <?>list)方法的源代码:(Oracal官网的)
public class Collections {
private static Random r;
private static final int SHUFFLE_THRESHOLD = 5;
public static void shuffle(List<?> list) {
if (r == null) {
r = new Random();
}
shuffle(list, r);
}
public static void shuffle(List<?> list, Random rnd) {
int size = list.size();
if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
for (int i = size; i > 1; i--)
swap(list, i - 1, rnd.nextInt(i));
} else {
Object arr[] = list.toArray();
// Shuffle array
for (int i = size; i > 1; i--)
swap(arr, i - 1, rnd.nextInt(i));
// Dump array back into list
ListIterator it = list.listIterator();
for (int i = 0; i < arr.length; i++) {
it.next();
it.set(arr[i]);
}
}
}
public static void swap(List<?> list, int i, int j) {
final List l = list;
l.set(i, l.set(j, l.get(i)));
}
private static void swap(Object[] arr, int i, int j) {
Object tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
上面代码用一句话来讲,就是list生成随机下标,下标交换元素。