用于打乱List中个元素的排序顺序,实现“洗牌”的效果。
先看下源码:
public class Collections {
2 private static Random r;
3 private static final int SHUFFLE_THRESHOLD = 5;
4
5 public static void shuffle(List<?> list) {
6 if (r == null) {
7 r = new Random();
8 }
9 shuffle(list, r);
10 }
11
12 public static void shuffle(List<?> list, Random rnd) {
13 int size = list.size();
14 if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
15 for (int i = size; i > 1; i--)
16 swap(list, i - 1, rnd.nextInt(i));
17 } else {
18 Object arr[] = list.toArray();
19
20 // Shuffle array
21 for (int i = size; i > 1; i--)
22 swap(arr, i - 1, rnd.nextInt(i));
23
24 // Dump array back into list
25 ListIterator it = list.listIterator();
26 for (int i = 0; i < arr.length; i++) {
27 it.next();
28 it.set(arr[i]);
29 }
30 }
31 }
32
33 public static void swap(List<?> list, int i, int j) {
34 final List l = list;
35 l.set(i, l.set(j, l.get(i)));
36 }
37
38 private static void swap(Object[] arr, int i, int j) {
39 Object tmp = arr[i];
40 arr[i] = arr[j];
41 arr[j] = tmp;
42 }
43
44 }
示例:
- // ShuffleTest.java
- import java.util.*;
- public class ShuffleTest {
- public static void main(String[] args) {
- List<Integer> list = new ArrayList<Integer>();
- for (int i = 0; i < 10; i++)
- list.add(new Integer(i));
- System.out.println("打乱前:");
- System.out.println(list);
- for (int i = 0; i < 5; i++) {
- System.out.println("第" + i + "次打乱:");
- Collections.shuffle(list);
- System.out.println(list);
- }
- }
- }
输出结果:
打乱前:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
第0次打乱:
[6, 3, 2, 0, 8, 1, 7, 5, 4, 9]
第1次打乱:
[6, 2, 3, 0, 8, 5, 7, 4, 9, 1]
第2次打乱:
[1, 7, 9, 4, 6, 0, 2, 5, 3, 8]
第3次打乱:
[0, 4, 2, 8, 9, 1, 3, 7, 5, 6]
第4次打乱:
[8, 1, 3, 0, 7, 9, 4, 2, 5, 6]
摘自:http://topic.csdn.net/u/20080308/17/642f73e3-ff7b-4144-a52b-190a72be1e49.html