84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
ringa_lee
for (int i=size; i>1; i--) swap(list, i-1, rnd.nextInt(i));
shuffle搅乱列表顺序,使用Random生成索引(随机数),将i-1的元素与随机索引交换。循环collection.size()次。
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是一个标记接口,如果实现了这个接口就表示支持快速的随机访问操作,类似于数组。
RandomAccess
如果大于等于5个元素也没有实现RandomAccess接口,那么就转为数组,之后也是循环,随机交换集合中两个相邻的元素的位置,最后再将数组放回原来的list中。
list
就是最Collection进行『近似』随机打乱,原理很简单,基于随机数生成器,随机交互Collection的元素顺序。
shuffle
搅乱列表顺序,使用Random
生成索引(随机数),将i-1
的元素与随机索引交换。循环collection.size()
次。这种问题直接看源码就好啦。
以上是JDK的源码,核心的方法就是这个
shuffle
,去掉了部分注释。首先获取集合的元素个数,如果小于5个或者实现了
RandomAccess
接口,就循环一遍,随机交换集合中两个相邻的元素的位置,RandomAccess
是一个标记接口,如果实现了这个接口就表示支持快速的随机访问操作,类似于数组。如果大于等于5个元素也没有实现
RandomAccess
接口,那么就转为数组,之后也是循环,随机交换集合中两个相邻的元素的位置,最后再将数组放回原来的list
中。就是最Collection进行『近似』随机打乱,原理很简单,基于随机数生成器,随机交互Collection的元素顺序。