前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 数组乱序的实现方式

Java 数组乱序的实现方式

作者头像
猫老师的叶同学
发布2023-03-01 13:54:08
5880
发布2023-03-01 13:54:08
举报
文章被收录于专栏:中间件的探究中间件的探究

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 洗牌算法和其他实现数据乱序的作用
    • 1、需求
      • 2、实现方式
        • 3、总结
        相关产品与服务
        数据库
        云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档