摘要:如何對兩個列表進行亂序處理,同時保持它們的一一對應的關系已知我們有兩個列表其中和中的元素是一一對應的?,F(xiàn)在我們希望對兩個列表進行隨機排序,要求排序后它們依舊是一一對應的。
如何對兩個列表進行亂序處理,同時保持它們的一一對應的關系?
已知我們有兩個列表
public class RandomizeTwoList { public static String [] file = {"H1.txt","H2.txt","H3.txt","M4.txt","M5.txt","M6.txt"}; public static ArrayListfileList = new ArrayList (Arrays.asList(file)); public static String [] img = {"e1.jpg","e2.jpg","e3.jpg","e4.jpg","e5.jpg","e6.jpg"}; public static ArrayList imgList = new ArrayList (Arrays.asList(img)); }
其中fileList和imgList中的元素是一一對應的。
現(xiàn)在我們希望對兩個列表進行隨機排序,要求排序后它們依舊是一一對應的。
提示: java.util.Collections可以使得一個列表亂序,但是下面的寫法是不可以的:
import java.util.Collections; public class RandomizeTwoListTest { @Test public void wrongRandomize(){ Collections.shuffle(fileList); Collections.shuffle(imgList); System.out.println(fileList); System.out.println(imgList); // [H3.txt, M5.txt, H2.txt, H1.txt, M6.txt, M4.txt] // [e6.jpg, e3.jpg, e4.jpg, e1.jpg, e2.jpg, e5.jpg] } }
我們可以看到java.util.Collections確實可以使得一個列表亂序,但是上面兩次亂序后列表之間失去了一一對應的關系,所以是不行的。
那我們怎么解決呢?
方案一: 把它們綁定起來我們之前的演示用例失敗的原因是兩次隨機化的規(guī)則不一樣,導致結果不能一一對應,那么我們現(xiàn)在可以
讓它們一一綁定起來,構造出一個list(當然也可以是map、onject)容納它們,然后再隨機排序。
@Test public void randomTogether(){ List> compoundList = new ArrayList(); for (int i = 0; i < fileList.size(); i++) { List
listItem = new ArrayList(); listItem.add(fileList.get(i)); listItem.add(imgList.get(i)); compoundList.add(listItem); } System.out.println(compoundList); // [[H1.txt, e1.jpg], [H2.txt, e2.jpg], [H3.txt, e3.jpg], [M4.txt, e4.jpg], [M5.txt, e5.jpg], [M6.txt, e6.jpg]] Collections.shuffle(compoundList); System.out.println(compoundList); // [[M5.txt, e5.jpg], [H2.txt, e2.jpg], [M4.txt, e4.jpg], [H3.txt, e3.jpg], [H1.txt, e1.jpg], [M6.txt, e6.jpg]] for (int i = 0; i < fileList.size(); i++) { fileList.set(i, compoundList.get(i).get(0)); imgList.set(i, compoundList.get(i).get(1)); } System.out.println(fileList); // [M5.txt, H2.txt, M4.txt, H3.txt, H1.txt, M6.txt] System.out.println(imgList); // [e5.jpg, e2.jpg, e4.jpg, e3.jpg, e1.jpg, e6.jpg] }
參考這樣的代碼。看起來很復雜,其實思路很簡單。
先把fileList第i個元素的值和imgList第i個元素的值綁定起來,構造出新的數(shù)組
然后對著數(shù)組進行亂序,亂序完成后原理的兩個list的對應依舊保持一致
將list整理還原
方案2: 采取同樣的方式隨機化我們來說一下Collections.shuffle 的原理。
當我們調用Collections.shuffle(List list)的時候,它其實做了這件事
public static void shuffle(List> list) { Random rnd = r; if (rnd == null) r = rnd = new Random(); // harmless race. shuffle(list, rnd); }
那么void shuffle(List> list, Random rnd) 又做了什么呢?
簡單的來說,它就是對傳進來的list做一次i遞減的for循環(huán),然后在每次循環(huán)的時候把第i個元素和rnd.nextInt(i)的值互換,這樣我們最終的list就是隨機亂序的了。
這里大家明白了吧,如果每次產生的隨機值一致,那么它們就隨機排序的結果就是一致的。
好了,有的同學就開始寫代碼了,寫出這樣的代碼了
@Test public void randomize(){ long seed = System.nanoTime(); Random random = new Random(seed); Collections.shuffle(fileList, random); Collections.shuffle(imgList, random); System.out.println(fileList); System.out.println(imgList); }
注意這樣是不行的哦,因為雖然是同一個Random,但是每次調用nextInt的結果是不一樣的。
應該這樣寫:
@Test public void randomize2(){ long seed = System.nanoTime(); Collections.shuffle(fileList, new Random(seed)); Collections.shuffle(imgList, new Random(seed)); System.out.println(fileList); System.out.println(imgList); // [M5.txt, M4.txt, H1.txt, H2.txt, H3.txt, M6.txt] // [e5.jpg, e4.jpg, e1.jpg, e2.jpg, e3.jpg, e6.jpg] }
兩個Random的隨機種子一樣,那么他們第i次的nextInt的值也是相等的。
https://github.com/fish-bugs/...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74521.html
摘要:如果到齊了,就可以開始統(tǒng)計出這個時間窗口內的指標了。這種里會遇到兩個難題多個流的速度不一樣,如何判斷一個時間窗口內的都到齊了。 在本文發(fā)出之后不久,老外就寫了一篇類似內容的。人家比我寫得好,推薦大家讀這篇http://radar.oreilly.com/2015/08/the-world-beyond-batch-streaming-101.... 流式統(tǒng)計聽著挺容易的一個事...
摘要:而在服務器中應該充分利用多線程來處理執(zhí)行邏輯。能保證所在的失效,該消息仍然可以從新選舉的中獲取,不會造成消息丟失。這意味著無需等待來自的確認而繼續(xù)發(fā)送下一批消息。 showImg(https://segmentfault.com/img/remote/1460000018373147?w=702&h=369); 1.概述 Apache Kafka最早是由LinkedIn開源出來的分布式...
閱讀 3143·2021-11-23 10:02
閱讀 3118·2021-11-16 11:53
閱讀 3093·2021-09-23 11:21
閱讀 3369·2019-08-30 13:02
閱讀 1622·2019-08-29 16:18
閱讀 1557·2019-08-29 12:55
閱讀 1457·2019-08-26 12:24
閱讀 2085·2019-08-26 10:36