java - Collections.shuffle
ringa_lee
ringa_lee 2017-04-18 10:07:02
0
3
601
ringa_lee
ringa_lee

ringa_lee

Antworte allen(3)
大家讲道理

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

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

洪涛

这种问题直接看源码就好啦。

@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中。

大家讲道理

就是最Collection进行『近似』随机打乱,原理很简单,基于随机数生成器,随机交互Collection的元素顺序。

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!