java-Collections类中shuffle的用法

来源:互联网 发布:访客网络应该限速多少 编辑:程序博客网 时间:2024/06/10 13:04

用于打乱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 array21             for (int i = size; i > 1; i--)22                 swap(arr, i - 1, rnd.nextInt(i));23 24             // Dump array back into list25             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 }

示例:

[java] view plaincopy
  1. // ShuffleTest.java  
  2.   
  3. import java.util.*;  
  4.   
  5. public class ShuffleTest {  
  6.     public static void main(String[] args) {  
  7.         List<Integer> list = new ArrayList<Integer>();  
  8.         for (int i = 0; i < 10; i++)  
  9.             list.add(new Integer(i));  
  10.         System.out.println("打乱前:");  
  11.         System.out.println(list);  
  12.   
  13.         for (int i = 0; i < 5; i++) {  
  14.             System.out.println("第" + i + "次打乱:");  
  15.             Collections.shuffle(list);  
  16.             System.out.println(list);  
  17.         }  
  18.     }  
  19. }  

输出结果:

打乱前:
[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


0 0
原创粉丝点击