Java中的shuffle洗牌集合

1.概述

在這篇快速的文章中,我們將看到如何用Java改組一個集合。 Java有一個內置的方法用於改組List對象-我們還將在其他集合中使用它。

2.改組列表

我們將使用方法java.util.Collections.shuffle ,該方法List作為輸入並就地進行隨機排序。就地而言,我們的意思是它將與輸入中傳遞的列表進行混排,而不是使用混排的元素創建一個新列表。

讓我們看一個簡單的示例,該示例顯示如何對List進行隨機播放:

List<String> students = Arrays.asList("Foo", "Bar", "Baz", "Qux");

 Collections.shuffle(students);

還有第二個版本的java.util.Collections.shuffle ,它也接受自定義隨機性源作為輸入。如果我們對應用程序有這樣的要求,則可以使用它來確定改組過程。

讓我們使用第二個變體在兩個列表上實現相同的改組:

List<String> students_1 = Arrays.asList("Foo", "Bar", "Baz", "Qux");

 List<String> students_2 = Arrays.asList("Foo", "Bar", "Baz", "Qux");



 int seedValue = 10;



 Collections.shuffle(students_1, new Random(seedValue));

 Collections.shuffle(students_2, new Random(seedValue));



 assertThat(students_1).isEqualTo(students_2);

當使用相同的隨機源(從相同的種子值初始化)時,兩個隨機產生的隨機數序列將相同。因此,在改組後,兩個列表都將包含完全相同順序的元素。

3.無序集合的重排元素

例如,我們可能還希望改組其他集合,例如Set,MapQueue ,但是所有這些集合都是無序的,它們不維護任何特定的順序。

某些實現(例如LinkedHashMap或帶有比較器Set)確實會保持固定順序,因此我們也無法對其進行洗牌。

但是,我們仍然可以通過將它們首先轉換為List ,然後將這個List改組為隨機訪問它們的元素。

讓我們看一下一個Map元素重排的簡單示例:

Map<Integer, String> studentsById = new HashMap<>();

 studentsById.put(1, "Foo");

 studentsById.put(2, "Bar");

 studentsById.put(3, "Baz");

 studentsById.put(4, "Qux");



 List<Map.Entry<Integer, String>> shuffledStudentEntries

 = new ArrayList<>(studentsById.entrySet());

 Collections.shuffle(shuffledStudentEntries);



 List<String> shuffledStudents = shuffledStudentEntries.stream()

 .map(Map.Entry::getValue)

 .collect(Collectors.toList());

類似地,我們可以隨機播放Set的元素:

Set<String> students = new HashSet<>(

 Arrays.asList("Foo", "Bar", "Baz", "Qux"));

 List<String> studentList = new ArrayList<>(students);

 Collections.shuffle(studentList);

4。結論

在本快速教程中,我們了解瞭如何使用java.util.Collections.shuffle來隨機播放Java中的各種集合。

這自然可以直接與List一起使用我們也可以間接利用它來隨機化其他集合中元素的順序。我們還可以通過提供自定義的隨機性來源並使其具有確定性來控制改組過程。

和往常一樣,本文演示的所有代碼都可以在GitHub上獲得