List集合随机排序引发的思考
前言
最近一直再分享手写web
服务器的内容,感觉能分享的东西差不多都已经分享了,剩下的内容要么是短期没法出成果的,要么是需要花时间去优化的,另外这段时间确实太卷了,所以本着劳逸结合的想法,我们今天分享个小知识点,而且未来几天也打算这么搞,毕竟好的内容是需要孕育、酝酿,需要慢慢生发的。
随机算法
今天的内容分其实就是给大家介绍下Collections
的shuffle
方法,这个单词的中文含义是洗牌,所以这个方法的作用就是打乱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 -