List集合随机排序引发的思考

云中志

共 2250字,需浏览 5分钟

 · 2021-06-12

前言

最近一直再分享手写web服务器的内容,感觉能分享的东西差不多都已经分享了,剩下的内容要么是短期没法出成果的,要么是需要花时间去优化的,另外这段时间确实太卷了,所以本着劳逸结合的想法,我们今天分享个小知识点,而且未来几天也打算这么搞,毕竟好的内容是需要孕育、酝酿,需要慢慢生发的。

随机算法

今天的内容分其实就是给大家介绍下Collectionsshuffle方法,这个单词的中文含义是洗牌,所以这个方法的作用就是打乱list集合中元素的顺序,达到乱序的效果。

为什么要讲这个?最大的原因是,对于随机散列这块的认识太浅显了,知识面也太窄,只知道Random方法,其他的一概不了解,散列算法也只是听说过名字,但是在实际开发中,我们是有可能遇到各种随机应用场景的,比如随机红包,随机试题,所以掌握一些常用的随机算法是很有必要的。

认识到这个方法是昨天在看公司旧代码的时候,有个接口就是用来随机抽题的,没看这个方法之前,我以为随机抽题的算法就是把数据拿出来放进集合,然后循环生成随机数,按随机数去获取集合中的元素,连我之前说要实现自动生成笔记卡片,随机图片那里可以这么考虑的。

直到昨天到了shuffle方法,感觉对随机解决方案也有了更深入的认知。

下面我们看一段代码:

public static void main(String[] args) {
        List<Integer> longList = Lists.newArrayList();
        for (int i = 0; i < 10; i++) {
            longList.add(i);
        }
        System.out.println("随机排序前:"+ longList);
        long startTime = System.currentTimeMillis();
        Collections.shuffle(longList);
        long useTime = System.currentTimeMillis() - startTime;
        System.out.println("用时:" + useTime);
        System.out.println("随机排序后:"+ longList);
    }

这段代码的演示了,shuffle的用法,我们只需要讲list集合传入即可,运行之后list就会变成一个随机排列的list:

多次运行,你会发现每次的顺序都是不一样的,当然对于一个长度确定的集合,它的排序方式的数量是确定的,但是我们大部分的应用场景都是允许重复的。

扩展

下来,我们来说下简单的应用场景。就拿随机试题考试来说,考过驾照的小伙伴都知道,我们在考科目一科目四的时候,题目和选项的顺序都是随机排列的,那么对于这种应用场景,我们可以这样来做:

  • 从数据库中查出所有试题,通过shuffle打乱试题顺序,然后从乱序的试题中,截取我们需要的试题数量即可,这样返回的试题题目就是随机的
  • 如果是选择题,我们也可以通过同样的方法对选项进行操作,这样两个人就算抽到同样的试题,题目的选项也是不一样的

再比如我随机图片的需求,我可以查出所有图片,对结果进行随机排序,然后拿出集合的第一个元素即可

总结

今天的内容,只介绍了一个随机排序方法,代码比较少,但是我觉得意义挺大的,作为一个开发人员不仅要埋头写代码,更重要的是要去广泛涉猎各种知识,看各种实现方式,这些看似不起眼的习惯,一定程度上决定了你为了的高度。

任何行业,都是这样,思维和眼界,才是决定你职业方向和深度的关键,我们一起共勉,加油吧!

- END -


浏览 50
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报