Shuffling Collections In Java

1. Overview

In this quick article, we’ll see how we can shuffle a collection in Java. Java has a built-in method for shuffling List objects — we’ll utilize it for other collections as well.

2. Shuffling a List

We’ll use the method java.util.Collections.shuffle, which takes as input a List and shuffles it in-place. By in-place, we mean that it shuffles the same list as passed in input instead of creating a new one with shuffled elements.

Let’s look at a quick example showing how to shuffle a List:

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

There’s a second version of java.util.Collections.shuffle that also accepts as input a custom source of randomness. This can be used to make shuffling a deterministic process if we have such a requirement for our application.

Let’s use this second variant to achieve the same shuffling on two lists:

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

When using identical sources of randomness (initialized from same seed value), the generated random number sequence will be the same for both shuffles. Thus, after shuffling, both lists will contain elements in the exact same order.

3. Shuffling Elements of Unordered Collections

We may want to shuffle other collections as well such as Set, Map, or Queue, for example, but all these collections are unordered — they don’t maintain any specific order.

Some implementations, such as LinkedHashMap, or a Set with a Comparator – do maintain a fixed order, thus we cannot shuffle them either.

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

Let’s see a quick example of shuffling elements of a 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());

Similarly, we can shuffle elements of a Set:

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

4. Conclusion

In this quick tutorial, we saw how to use java.util.Collections.shuffle to shuffle various collections in Java.

This naturally works directly with a List, and we can utilize it indirectly to randomize the order of elements in other collections as well. We can also control the shuffling process by providing a custom source of randomness and make it deterministic.

As usual, all code demonstrated in this article is available over on GitHub.

Related posts:

Handle EML file with JavaMail
Predicate trong Java 8
Java Program to Implement Control Table
Java Program to Check Whether Topological Sorting can be Performed in a Graph
Java Program to Generate Date Between Given Range
Getting Started with GraphQL and Spring Boot
Spring Boot - Web Socket
Java Program to Check if a Directed Graph is a Tree or Not Using DFS
Implementing a Binary Tree in Java
Java Program to Find the Peak Element of an Array O(n) time (Naive Method)
Convert char to String in Java
Adding Shutdown Hooks for JVM Applications
Từ khóa static và final trong java
A Guide to Java HashMap
Java Program to Implement Word Wrap Problem
Java Program to Implement Sorted Array
Java Program to do a Depth First Search/Traversal on a graph non-recursively
Using JWT with Spring Security OAuth (legacy stack)
A Guide to Spring Cloud Netflix – Hystrix
Serialization và Deserialization trong java
Spring Boot - Code Structure
Java Program to Implement Segment Tree
REST Web service: Upload và Download file với Jersey 2.x
Java Program to Perform Partial Key Search in a K-D Tree
Functional Interface trong Java 8
Java Program to Perform the Sorting Using Counting Sort
Spring MVC + Thymeleaf 3.0: New Features
Java Program to Check whether Graph is a Bipartite using BFS
Java Program to Give an Implementation of the Traditional Chinese Postman Problem
StringBuilder vs StringBuffer in Java
Java Web Services – Jersey JAX-RS – REST và sử dụng REST API testing tools với Postman
Java Program to Implement Doubly Linked List