首頁  >  問答  >  主體

java - Collections.shuffle

ringa_leeringa_lee2728 天前611

全部回覆(3)我來回復

  • 大家讲道理

    大家讲道理2017-04-18 10:09:02

    
        for (int i=size; i>1; i--)
            swap(list, i-1, rnd.nextInt(i));
    

    shuffle搅乱列表顺序,使用Random生成索引(随机数),将i-1的元素与随机索引交换。循环collection.size()次。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 10:09:02

    這種問題直接看源碼就好啦。

    @SuppressWarnings({"rawtypes", "unchecked"})
        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));
    
                ListIterator it = list.listIterator();
                for (int i=0; i<arr.length; i++) {
                    it.next();
                    it.set(arr[i]);
                }
            }
        }

    以上是JDK的原始碼,核心的方法就是這個shuffle,去掉了部分註解。

    首先獲取集合的元素個數,如果小於5個或者實現了RandomAccess接口,就循环一遍,随机交换集合中两个相邻的元素的位置,RandomAccess是一個標記接口,如果實現了這個接口就表示支持快速的隨機訪問操作,類似於數組。

    如果大於等於5個元素也沒有實現RandomAccess接口,那么就转为数组,之后也是循环,随机交换集合中两个相邻的元素的位置,最后再将数组放回原来的list中。

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-18 10:09:02

    就是最Collection進行『近似』隨機打亂,原理很簡單,基於隨機數產生器,隨機交互Collection的元素順序。

    回覆
    0
  • 取消回覆