List集合隨機(jī)排序引發(fā)的思考

前言
最近一直再分享手寫web服務(wù)器的內(nèi)容,感覺能分享的東西差不多都已經(jīng)分享了,剩下的內(nèi)容要么是短期沒法出成果的,要么是需要花時(shí)間去優(yōu)化的,另外這段時(shí)間確實(shí)太卷了,所以本著勞逸結(jié)合的想法,我們今天分享個(gè)小知識點(diǎn),而且未來幾天也打算這么搞,畢竟好的內(nèi)容是需要孕育、醞釀,需要慢慢生發(fā)的。
隨機(jī)算法
今天的內(nèi)容分其實(shí)就是給大家介紹下Collections的shuffle方法,這個(gè)單詞的中文含義是洗牌,所以這個(gè)方法的作用就是打亂list集合中元素的順序,達(dá)到亂序的效果。
為什么要講這個(gè)?最大的原因是,對于隨機(jī)散列這塊的認(rèn)識太淺顯了,知識面也太窄,只知道Random方法,其他的一概不了解,散列算法也只是聽說過名字,但是在實(shí)際開發(fā)中,我們是有可能遇到各種隨機(jī)應(yīng)用場景的,比如隨機(jī)紅包,隨機(jī)試題,所以掌握一些常用的隨機(jī)算法是很有必要的。
認(rèn)識到這個(gè)方法是昨天在看公司舊代碼的時(shí)候,有個(gè)接口就是用來隨機(jī)抽題的,沒看這個(gè)方法之前,我以為隨機(jī)抽題的算法就是把數(shù)據(jù)拿出來放進(jìn)集合,然后循環(huán)生成隨機(jī)數(shù),按隨機(jī)數(shù)去獲取集合中的元素,連我之前說要實(shí)現(xiàn)自動(dòng)生成筆記卡片,隨機(jī)圖片那里可以這么考慮的。
直到昨天到了shuffle方法,感覺對隨機(jī)解決方案也有了更深入的認(rèn)知。
下面我們看一段代碼:
public static void main(String[] args) {
List<Integer> longList = Lists.newArrayList();
for (int i = 0; i < 10; i++) {
longList.add(i);
}
System.out.println("隨機(jī)排序前:"+ longList);
long startTime = System.currentTimeMillis();
Collections.shuffle(longList);
long useTime = System.currentTimeMillis() - startTime;
System.out.println("用時(shí):" + useTime);
System.out.println("隨機(jī)排序后:"+ longList);
}
這段代碼的演示了,shuffle的用法,我們只需要講list集合傳入即可,運(yùn)行之后list就會(huì)變成一個(gè)隨機(jī)排列的list:

多次運(yùn)行,你會(huì)發(fā)現(xiàn)每次的順序都是不一樣的,當(dāng)然對于一個(gè)長度確定的集合,它的排序方式的數(shù)量是確定的,但是我們大部分的應(yīng)用場景都是允許重復(fù)的。
擴(kuò)展
下來,我們來說下簡單的應(yīng)用場景。就拿隨機(jī)試題考試來說,考過駕照的小伙伴都知道,我們在考科目一科目四的時(shí)候,題目和選項(xiàng)的順序都是隨機(jī)排列的,那么對于這種應(yīng)用場景,我們可以這樣來做:
從數(shù)據(jù)庫中查出所有試題,通過 shuffle打亂試題順序,然后從亂序的試題中,截取我們需要的試題數(shù)量即可,這樣返回的試題題目就是隨機(jī)的如果是選擇題,我們也可以通過同樣的方法對選項(xiàng)進(jìn)行操作,這樣兩個(gè)人就算抽到同樣的試題,題目的選項(xiàng)也是不一樣的
再比如我隨機(jī)圖片的需求,我可以查出所有圖片,對結(jié)果進(jìn)行隨機(jī)排序,然后拿出集合的第一個(gè)元素即可
總結(jié)
今天的內(nèi)容,只介紹了一個(gè)隨機(jī)排序方法,代碼比較少,但是我覺得意義挺大的,作為一個(gè)開發(fā)人員不僅要埋頭寫代碼,更重要的是要去廣泛涉獵各種知識,看各種實(shí)現(xiàn)方式,這些看似不起眼的習(xí)慣,一定程度上決定了你為了的高度。
任何行業(yè),都是這樣,思維和眼界,才是決定你職業(yè)方向和深度的關(guān)鍵,我們一起共勉,加油吧!
- END -