1. Overview
In this tutorial, we’ll see how we can shuffle some Scala collections like Lists, Maps, and Sets.
2. Shuffle a List
If we want to shuffle a List, or even other Scala collections like Seq and Array, we may start looking into coding our own implementation of some shuffling algorithm like the well-known Fisher-Yates shuffle. Unfortunately, it’s not as trivial as we may think at first. Bugs are easy to introduce and hard to detect.
Fortunately, the Scala standard lib already offers a way to achieve this, using the Random.shuffle() method:
scala> import scala.util.Random
scala> val lst = List(1,2,3,4,5)
val lst: List[Int] = List(1, 2, 3, 4, 5)
scala> Random.shuffle(lst)
val res0: List[Int] = List(2, 1, 4, 3, 5)
scala> Random.shuffle(lst)
val res1: List[Int] = List(1, 5, 3, 4, 2)
scala> Random.shuffle(lst)
val res2: List[Int] = List(3, 1, 4, 2, 5)
It’s worth noting that the Random.shuffle() method doesn’t modify the original collection – it returns a new shuffled collection.
3. Shuffle a Seq
The Random.shuffle() method also works with other collections like Seq:
scala> val seq = Seq(1,2,3,4,5)
val seq: Seq[Int] = List(1, 2, 3, 4, 5)
scala> Random.shuffle(seq)
val res3: Seq[Int] = List(4, 5, 1, 2, 3)
scala> Random.shuffle(seq)
val res4: Seq[Int] = List(1, 4, 2, 3, 5)
scala> Random.shuffle(seq)
val res5: Seq[Int] = List(3, 1, 5, 2, 4)
4. Shuffle a Map
We can use the same technique when working with Maps:
scala> val m = Map('a' -> 1, 'b' -> 2, 'c' -> 3)
val m: Map[Char, Int] = Map(a -> 1, b -> 2, c -> 3)
scala> Random.shuffle(m)
val res9: Map[Char, Int] = Map(c -> 3, a -> 1, b -> 2)
scala> Random.shuffle(m)
val res10: Map[Char, Int] = Map(a -> 1, b -> 2, c -> 3)
scala> Random.shuffle(m)
val res11: Map[Char, Int] = Map(c -> 3, a -> 1, b -> 2)
5. Shuffle a Set
However, if we try to shuffle a Set using Random.shuffle(), nothing happens:
scala> val set = Set(1,2,3,4,5)
val set: Set[Int] = HashSet(5, 1, 2, 3, 4)
scala> Random.shuffle(set)
val res6: Set[Int] = HashSet(5, 1, 2, 3, 4)
scala> Random.shuffle(set)
val res7: Set[Int] = HashSet(5, 1, 2, 3, 4)
This is because a Set is already an unsorted collection. So it has no ordering guarantees.
6. Conclusion
In this article, we saw a very easy way to shuffle List, Seq, and Map in Scala. The approach uses the Random class from the standard lib.