如何打乱List 或 Array元素的顺序
来源:互联网 发布:网络机顶盒看直播软件 编辑:程序博客网 时间:2024/05/22 06:37
如何打乱List 或 Array元素的顺序
打乱List或者Array数据元素的顺序,其实就是让集合中的元素变得随机,举个例子,有如下一个Array数据:
其中存储了 1, 2, 3, 4, 5 一共五个元素,经过程序随机排序后得到另外一个随机乱序的数组。
其Java实现代码如下:
public class ArrayRandomUtils { public static void main(String[] args) { int[] arr = new int[]{1, 2, 3, 4, 5}; arr = randomArr(arr); System.out.println(Arrays.toString(arr)); } public static int[] randomArr(int[] arr) { int[] arrTemp = new int[5]; int end = arr.length; Random rad = new Random(); for (int i = 0; i < arr.length; i++) { int index = rad.nextInt(end); arrTemp[i] = arr[index]; arr[index] = arr[end - 1]; end--; } return arrTemp; }}
实现思路如下:
1、随机生成一个原数组长度内的随机整数 index;
2、将随机位置 index 上的元素拷贝到新数组的第 i 个位置;
3、然后,将原数组中第 end(end的初始值为原数组的长度) 个元素拷贝至原数组的第 index 位置;
4、最后,将 end– 相当于原数组的一个元素已经被随机到了新数组中。
处理流程:
Collections 洗牌算法源码
了解了以上数组元素随机打乱的算法之后,再来看一下Collections 的 shuffle 方法的源码就很好理解了。
public static void shuffle(List<?> list) { Random rnd = r; if (rnd == null) r = rnd = new Random(); shuffle(list, rnd);}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)); // Dump array back into list ListIterator it = list.listIterator(); for (int i=0; i<arr.length; i++) { it.next(); it.set(arr[i]); } }}
0 0
- 如何打乱List 或 Array元素的顺序
- js为Array添加打乱元素顺序的函数shuffle()
- 【Array、List】Java数组或集合中如何删除元素
- 如何打乱一个数组的顺序
- 如何打乱字符串中字符的顺序
- 请问如何将数组中元素顺序打乱
- jq随机打乱元素顺序
- 打乱list集合数据顺序,达到随机显示的目的
- 使用Collections类中shuffle随机打乱List内部元素顺序
- java中list集合去处重复元素并且不打乱顺序
- 如何打乱训练样本和测试样本的顺序
- 将list集合,元素随机打乱
- 打乱数组的顺序 c#
- 打乱数组的顺序 c#
- 数组打乱顺序的方法
- 不打乱顺序的情况下去除数组中的重复元素
- 完美洗牌问题(打乱数组间各元素的顺序)
- C++将数组的元素顺序随机打乱(条件概率证明算法充分随机)
- 重构案例积累系列:get set方法重构
- 深入解析Android事件分发机制源码(1)
- 在导入com.android.support:design时的常见错误Please configure your build for VectorDrawableCompat
- 51nod 1607 卷积和(枚举搜索)
- 如何设置Button控件的边框颜色
- 如何打乱List 或 Array元素的顺序
- C++常见知识点复习-如何限制类对象只能在堆上或者栈上分配
- Android——使用GridView制作二维布局界面(行、列分布)
- 如何在Python中实现这五类强大的概率分布
- 如何使用Retrofit下载大文件
- [数据结构] HDU5812 Distance
- CodeForces 689C Mike and Chocolate Thieves
- MySQL之Field 'email' doesn't have a default value问题
- Java_Pro4_回收探究_08_10