Java 数组乱序的实现方式

2023-03-01 13:54:08 浏览数 (1)

洗牌算法和其他实现数据乱序的作用

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字段排序,就可以实现数据的乱序。

0 人点赞