洗牌算法和其他实现数据乱序的作用
1、需求
前提: 在批量保存大量数据时,如果可以根据需要实现数据的乱序排列,而不是有序排列并存入数据库中。由于List数组是有序的,且使用的批量保存封装到List中的数据到数据库中。 方案: 数据表中添加sort字段来进行排序,那么这个字段如何赋值呢?这就是接下来的分享的。
2、实现方式
传入List的大小并根据它的大小生成一个List数组
代码语言:javascript复制public static void main(String[] args) {
// 假定这个是需要保存数据List的长度
int length = 5;
Integer[] array = new Integer[length];
for (int i = 0; i < length; i ) {
array[i] = i;
}
// [0, 1, 2, 3, 4]
System.out.println(Arrays.toString(array));
}
这里我们可以得到一个长度为5的数组排序,那么接下来如何实现数组内的乱序呢?
2.1、Collections封装洗牌算法
第一种实现方式:使用Java中Collections封装好的洗牌算法,直接使用,每次执行的排序结果都不一致。代码简洁方便。
代码语言:javascript复制public static void main(String[] args) {
// 假定这个是需要保存数据List的长度
int length = 5;
Integer[] array = new Integer[length];
for (int i = 0; i < length; i ) {
array [i] = i;
}
List<Integer> list = Arrays.asList(array);
Collections.shuffle(list);
// [4, 1, 3, 2, 0] 第一次
// [1, 4, 2, 0, 3] 第二次
System.out.println(list);
}
2.2、实现Comparator,自定义排序规则
第二种实现方式:实现Comparator接口,并定义排序的方法,这里的排序规则,使用随机数并通过随机数的大小来实现数组的排前排后。
代码语言:javascript复制public static void main(String[] args) {
// 假定这个是需要保存数据List的长度
int length = 5;
Integer[] array = new Integer[length];
for (int i = 0; i < length; i ) {
array [i] = i;
}
Comparator<Integer> cmp = (o1, o2) -> Math.random() < 0.5 ? 1 : -1;
Arrays.sort(array, cmp);
//[1, 3, 0, 2, 4] 第一次
//[0, 1, 2, 3, 4] 第二次
System.out.println(Arrays.toString(array));
}
2.3、使用随机数
第三种实现方式:使用Random类,获取length范围内的随机数并进行去重,而后生成乱序的数组。
代码语言:javascript复制public static void main(String[] args) {
int length = 5;
Random random = new Random();
boolean[] bool = new boolean[length];
int[] result = new int[length];
int rand = 0;
for (int j = 0; j < length; j ) {
/*
* 得到 length 个不同的随机数
*/
do {
rand = random.nextInt(length);
result[j] = rand;
} while (bool[rand]);
bool[rand] = true;
}
// [3, 1, 2, 4, 0] 第一次
// [3, 1, 4, 0, 2] 第二次
System.out.println(Arrays.toString(result));
}
2.4、随机交换数据元素位置
第四种实现方式:和第三种方式很相似,这是这里不是生成值,而是交换数据之前的顺序,需要进行去重判断。
代码语言:javascript复制public static void main(String[] args) {
// 假定这个是需要保存数据List的长度
int length = 5;
Integer[] array = new Integer[length];
for (int i = 0; i < length; i ) {
array [i] = i;
}
for(int i=0; i<length; i ){
int iRandNum = (int)(Math.random() * length);
int temp = array[iRandNum];
array[iRandNum] = array[i];
array[i] = temp;
}
// [1, 3, 0, 4, 2] 第一次
// [2, 4, 3, 1, 0] 第二次
System.out.println(Arrays.toString(array));
}
3、总结
通过以上四种方式取得乱序的数组,并将数组中的元素放入sort字段中并保存,这样在查询时根据sort字段排序,就可以实现数据的乱序。