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:

Getting Started with Custom Deserialization in Jackson
Java Program to Implement Find all Cross Edges in a Graph
Lập trình đa luồng với CompletableFuture trong Java 8
Spring Boot: Customize the Jackson ObjectMapper
Java Program to Implement Self Balancing Binary Search Tree
Guide to java.util.concurrent.Future
How to Read HTTP Headers in Spring REST Controllers
ThreadPoolTaskExecutor corePoolSize vs. maxPoolSize
The Registration API becomes RESTful
Supplier trong Java 8
Java Program to Implement Fermat Factorization Algorithm
Get and Post Lists of Objects with RestTemplate
Spring Security and OpenID Connect
ETags for REST with Spring
Một số tính năng mới về xử lý ngoại lệ trong Java 7
Java 8 Collectors toMap
Java Program to Represent Graph Using Incidence List
Comparing getPath(), getAbsolutePath(), and getCanonicalPath() in Java
Hướng dẫn Java Design Pattern – Singleton
Working With Maps Using Streams
Java Program to Implement Gale Shapley Algorithm
Hướng dẫn sử dụng luồng vào ra nhị phân trong Java
Quick Guide to @RestClientTest in Spring Boot
Guide to UUID in Java
Giới thiệu SOAP UI và thực hiện test Web Service
Java Program to Implement Range Tree
Java Program to Create the Prufer Code for a Tree
Java Program to Perform Stooge Sort
Java Program to Generate All Possible Combinations Out of a, b, c, d, e
Java Program to Implement IdentityHashMap API
Java Program to Perform Preorder Recursive Traversal of a Given Binary Tree
Introduction to Apache Commons Text