Sammlungen in Java mischen

1. Übersicht

In diesem kurzen Artikel werden wir sehen, wie wir eine Sammlung in Java mischen können . Java hat eine integrierte Methode für schlurfenden Liste Objekte - wir es auch für andere Sammlungen als auch nutzen werden.

2. Eine Liste mischen

Wir werden die Methode java.util.Collections.shuffle verwenden , die eine Liste als Eingabe verwendet und an Ort und Stelle mischt. Mit In-Place meinen wir, dass dieselbe Liste wie bei der Eingabe übergeben wird, anstatt eine neue Liste mit gemischten Elementen zu erstellen.

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

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

Es gibt eine zweite Version von java.util.Collections.shuffle , die auch eine benutzerdefinierte Zufallsquelle als Eingabe akzeptiert. Dies kann verwendet werden, um das Mischen zu einem deterministischen Prozess zu machen, wenn wir eine solche Anforderung für unsere Anwendung haben.

Verwenden wir diese zweite Variante, um das gleiche Mischen auf zwei Listen zu erzielen:

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);

Bei Verwendung identischer Zufallsquellen (initialisiert aus demselben Startwert) ist die generierte Zufallszahlenfolge für beide Mischvorgänge gleich. Daher enthalten beide Listen nach dem Mischen Elemente in genau derselben Reihenfolge.

3. Elemente ungeordneter Sammlungen mischen

Möglicherweise möchten wir auch andere Sammlungen wie Set, Map oder Queue mischen , aber alle diese Sammlungen sind ungeordnet - sie behalten keine bestimmte Reihenfolge bei.

Einige Implementierungen, wie z. B. LinkedHashMap oder ein Set mit einem Komparator , behalten eine feste Reihenfolge bei, daher können wir sie auch nicht mischen.

Allerdings können wir ihre Elemente zufällig Zugriff noch , indem sie zuerst in eine Umwandlung Liste , dann diese schlurfenden Liste .

Sehen wir uns ein kurzes Beispiel für das Mischen von Elementen einer Karte 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());
    

Ebenso können wir Elemente eines Sets 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 Sie mit java.util.Collections.shuffle verschiedene Sammlungen in Java mischen.

Dies funktioniert natürlich direkt mit einer Liste, und wir können sie 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 auf GitHub verfügbar.