Mischen von Sammlungen in Java

Mischen von Sammlungen in Java

1. Überblick

In diesem kurzen Artikel sehen wirhow we can shuffle a collection in Java. Java verfügt über eine integrierte Methode zum Mischen vonList-Objekten. Wir werden sie auch für andere Sammlungen verwenden.

2. Eine Liste mischen

We’ll use the method [.pl-smi]#java.util.Collections.shuffle [.blob-code-inner] [. pl-smi], das ### als Eingabe einList verwendet und es an Ort und Stelle mischt. Mit In-Place ist gemeint, dass dieselbe Liste wie in der Eingabe gemischt wird, anstatt eine neue Liste mit gemischten Elementen zu erstellen.

Schauen wir uns ein kurzes Beispiel an, das zeigt, wie einList gemischt wird:

List students = Arrays.asList("Foo", "Bar", "Baz", "Qux");
Collections.shuffle(students);

There’s a second version of [.pl-smi]#java.util.Collections.shuffle [.blob-code-inner] [.pl-smi]that also accepts as input a custom source of randomness. Dies kann verwendet werden, um das Mischen zu einem deterministischen Prozess zu machen, wenn wir eine solche Anforderung für unsere Anwendung haben.#

[.pl-smi]#Let’s use this second variant to achieve the same shuffling on two lists: #

List students_1 = Arrays.asList("Foo", "Bar", "Baz", "Qux");
List 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);

When using identical sources of randomness (initialized from same seed value), the generated random number sequence will be the same for both shuffles. Nach dem Mischen enthalten beide Listen Elemente in genau derselben Reihenfolge.

3. Elemente ungeordneter Sammlungen mischen

We may want to shuffle other collections as well such as Set, Map, or Queue, for example, but all these collections are unordered - Sie behalten keine bestimmte Reihenfolge bei.

Einige Implementierungen, wieLinkedHashMap oderSet mitComparator, behalten eine feste Reihenfolge bei, daher können wir sie auch nicht mischen.

we can still access their elements randomly by converting them first into a List, then shuffling this List.

Sehen wir uns ein kurzes Beispiel für das Mischen von Elementen vonMap an:

Map studentsById = new HashMap<>();
studentsById.put(1, "Foo");
studentsById.put(2, "Bar");
studentsById.put(3, "Baz");
studentsById.put(4, "Qux");

List> shuffledStudentEntries
 = new ArrayList<>(studentsById.entrySet());
Collections.shuffle(shuffledStudentEntries);

List shuffledStudents = shuffledStudentEntries.stream()
  .map(Map.Entry::getValue)
  .collect(Collectors.toList());

In ähnlicher Weise können wir Elemente von aSet mischen:

Set students = new HashSet<>(
  Arrays.asList("Foo", "Bar", "Baz", "Qux"));
List studentList = new ArrayList<>(students);
Collections.shuffle(studentList);

4. Fazit

In diesem kurzen Tutorial haben wir gesehen, wie[.pl-smi]#java.util.Collections.shuffle [.blob-code-inner] [.pl-smi] # verwendet wird, um verschiedene Sammlungen in Java zu mischen. ##

Dies funktioniert natürlich direkt mitList, und wir können es indirekt verwenden, um die Reihenfolge der Elemente auch in anderen Sammlungen zufällig zu bestimmen. Wir können den Mischprozess auch steuern, indem wir eine benutzerdefinierte Zufallsquelle bereitstellen und ihn deterministisch machen.

Wie üblich ist der gesamte in diesem Artikel gezeigte Code inover on GitHub verfügbar.