The shuffle()
method in Java is a utility method provided by the java.util.Collections
class. It is used to randomly permute the elements of a specified list. The method comes in three variants: one that uses a default source of randomness and two others that use a specified source of randomness.
Table of Contents
- Introduction
shuffle()
Method Syntax- Examples
- Basic Usage of
shuffle()
- Using
shuffle()
with a Specified Random Source - Using
shuffle()
with Custom Classes
- Basic Usage of
- Real-World Use Case
- Conclusion
Introduction
The Collections.shuffle()
method is useful for randomly rearranging the elements of a list. This can be used in scenarios such as shuffling a deck of cards, randomizing the order of quiz questions, or generating permutations for testing purposes.
Variants
- Default Randomness: Uses the default source of randomness to shuffle the list.
- Specified Randomness: Uses a specified
Random
orRandomGenerator
object to shuffle the list, allowing for reproducible shuffling results or customized random behavior.
shuffle() Method Syntax
Variant 1: Default Random Source
public static void shuffle(List<?> list)
-
Parameters:
list
: The list to be shuffled.
-
Throws:
UnsupportedOperationException
if the list does not support theset
operation.NullPointerException
if the specified list is null.
Variant 2: Specified Random Source
public static void shuffle(List<?> list, Random rnd)
-
Parameters:
list
: The list to be shuffled.rnd
: The random number generator to use for shuffling.
-
Throws:
UnsupportedOperationException
if the list does not support theset
operation.NullPointerException
if the specified list or random number generator is null.
Variant 3: Specified RandomGenerator Source
public static void shuffle(List<?> list, RandomGenerator rnd)
-
Parameters:
list
: The list to be shuffled.rnd
: The random generator to use for shuffling.
-
Throws:
UnsupportedOperationException
if the list does not support theset
operation.NullPointerException
if the specified list or random generator is null.
Examples
Basic Usage of shuffle()
The following example demonstrates how to use the shuffle()
method to randomly permute the elements of a list using the default source of randomness.
Example
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ShuffleExample {
public static void main(String[] args) {
// Create a list with initial elements
List<String> cards = new ArrayList<>();
Collections.addAll(cards, "Ace", "King", "Queen", "Jack", "10");
// Display the original list
System.out.println("Original List: " + cards);
// Shuffle the list using the default random source
Collections.shuffle(cards);
// Display the shuffled list
System.out.println("Shuffled List: " + cards);
}
}
Output:
Original List: [Ace, King, Queen, Jack, 10]
Shuffled List: [Jack, Queen, Ace, 10, King]
Using shuffle() with a Specified Random Source
You can also use the shuffle()
method with a specified Random
source to control the randomness, which is useful for reproducibility in testing.
Example
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class ShuffleWithRandomExample {
public static void main(String[] args) {
// Create a list with initial elements
List<Integer> numbers = new ArrayList<>();
Collections.addAll(numbers, 1, 2, 3, 4, 5);
// Display the original list
System.out.println("Original List: " + numbers);
// Create a random number generator with a fixed seed for reproducibility
Random random = new Random(42);
// Shuffle the list using the specified random source
Collections.shuffle(numbers, random);
// Display the shuffled list
System.out.println("Shuffled List with Random: " + numbers);
}
}
Output:
Original List: [1, 2, 3, 4, 5]
Shuffled List with Random: [2, 3, 4, 5, 1]
Using shuffle() with Custom Classes
You can use the shuffle()
method with lists containing instances of custom classes.
Example
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
class Student {
String name;
Student(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
public class CustomShuffleExample {
public static void main(String[] args) {
// Create a list of students
List<Student> students = new ArrayList<>();
students.add(new Student("Amit"));
students.add(new Student("Neha"));
students.add(new Student("Raj"));
// Display the original student list
System.out.println("Original Student List: " + students);
// Create a random number generator
Random random = new Random();
// Shuffle the list of students using the specified random source
Collections.shuffle(students, random);
// Display the shuffled student list
System.out.println("Shuffled Student List: " + students);
}
}
Output:
Original Student List: [Amit, Neha, Raj]
Shuffled Student List: [Raj, Amit, Neha]
Explanation:
-
Default Randomness: The
shuffle()
method without a random source uses the default randomness to shuffle the list. -
Specified
Random
Source: Using a specifiedRandom
object allows you to control the randomness, which can be useful for reproducibility in tests or simulations. -
Custom Class: The method works with custom class instances, shuffling the order of
Student
objects.
Using shuffle() with RandomGenerator
The shuffle()
method can also use a RandomGenerator
as its source of randomness, which is a more flexible interface introduced in newer versions of Java.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.random.RandomGenerator;
import java.util.random.RandomGeneratorFactory;
public class ShuffleWithRandomGeneratorExample {
public static void main(String[] args) {
// Create a list with initial elements
List<Integer> values = new ArrayList<>();
Collections.addAll(values, 10, 20, 30, 40, 50);
// Display the original list
System.out.println("Original List: " + values);
// Create a RandomGenerator instance
RandomGenerator randomGenerator = RandomGeneratorFactory.of("Random").create();
// Shuffle the list using the specified RandomGenerator
Collections.shuffle(values, randomGenerator);
// Display the shuffled list
System.out.println("Shuffled List with RandomGenerator: " + values);
}
}
Output:
Original List: [10, 20, 30, 40, 50]
Shuffled List with RandomGenerator: [40, 30, 50, 20, 10]
Explanation:
- RandomGenerator: The
RandomGenerator
interface provides a flexible way to generate random numbers with various algorithms, allowing you to choose the most suitable one for your application. Theshuffle()
method takes advantage of this interface for more customizable randomness.
Real-World Use Case
Shuffling a Deck of Cards
In real-world applications, the shuffle()
method can be used to shuffle a deck of cards, simulating the action of shuffling in card games.
Example
Imagine a scenario where you need to shuffle a deck of cards for a game.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Card {
String suit;
String rank;
Card(String suit, String rank) {
this.suit = suit;
this.rank = rank;
}
@Override
public String toString() {
return rank + " of " + suit;
}
}
public class DeckShuffleExample {
public static void main(String[] args) {
// Create a deck of cards
List<Card> deck = new ArrayList<>();
String[] suits = {"Hearts", "Diamonds", "Clubs", "Spades"};
String[] ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"};
// Populate the deck with cards
for (String suit : suits) {
for (String rank : ranks) {
deck.add(new Card(suit, rank));
}
}
// Display the original deck
System.out.println("Original Deck:");
System.out.println(deck);
// Shuffle the deck
Collections.shuffle(deck);
// Display the shuffled deck
System.out.println("\nShuffled Deck:");
System
.out.println(deck);
}
}
Output:
Original Deck:
[2 of Hearts, 3 of Hearts, 4 of Hearts, 5 of Hearts, 6 of Hearts, 7 of Hearts, 8 of Hearts, 9 of Hearts, 10 of Hearts, Jack of Hearts, Queen of Hearts, King of Hearts, Ace of Hearts, 2 of Diamonds, 3 of Diamonds, 4 of Diamonds, 5 of Diamonds, 6 of Diamonds, 7 of Diamonds, 8 of Diamonds, 9 of Diamonds, 10 of Diamonds, Jack of Diamonds, Queen of Diamonds, King of Diamonds, Ace of Diamonds, 2 of Clubs, 3 of Clubs, 4 of Clubs, 5 of Clubs, 6 of Clubs, 7 of Clubs, 8 of Clubs, 9 of Clubs, 10 of Clubs, Jack of Clubs, Queen of Clubs, King of Clubs, Ace of Clubs, 2 of Spades, 3 of Spades, 4 of Spades, 5 of Spades, 6 of Spades, 7 of Spades, 8 of Spades, 9 of Spades, 10 of Spades, Jack of Spades, Queen of Spades, King of Spades, Ace of Spades]
Shuffled Deck:
[5 of Hearts, 2 of Diamonds, Jack of Diamonds, 5 of Spades, Queen of Hearts, 6 of Clubs, King of Spades, 9 of Clubs, 8 of Spades, Ace of Clubs, 8 of Clubs, 4 of Clubs, 4 of Hearts, 2 of Spades, 6 of Diamonds, 4 of Diamonds, 9 of Spades, 9 of Diamonds, 10 of Spades, 7 of Clubs, Ace of Diamonds, 6 of Spades, 5 of Clubs, 2 of Clubs, 5 of Diamonds, 3 of Spades, Ace of Hearts, 3 of Hearts, 7 of Diamonds, 10 of Diamonds, 10 of Clubs, 2 of Hearts, Queen of Diamonds, 7 of Hearts, King of Clubs, 3 of Clubs, Jack of Clubs, Jack of Spades, 8 of Diamonds, 7 of Spades, Ace of Spades, King of Hearts, 4 of Spades, Jack of Hearts, 3 of Diamonds, 6 of Hearts, 8 of Hearts, 10 of Hearts, King of Diamonds, 9 of Hearts, Queen of Clubs, Queen of Spades]
Explanation:
-
Deck of Cards: The deck is created by populating a list with
Card
objects, each representing a card in a standard 52-card deck. -
Shuffle Operation: The
shuffle()
method is used to randomly permute the order of cards in the deck, simulating a shuffle. -
Randomized Deck: The shuffled deck displays the cards in a randomized order.
Conclusion
The Collections.shuffle()
method is a powerful utility for randomly permuting the elements of a list in Java. By providing a simple way to shuffle collections, it enhances the flexibility and readability of your code. This method is particularly valuable in scenarios where you need to randomize the order of elements, such as shuffling decks of cards or randomizing test data, improving the robustness and maintainability of your Java applications.