Table of Contents
This is an excerpt from the 1st Edition of the Scala Cookbook (partially modified for the internet). This is Recipe 11.27, “How to Delete Elements from Sets in Scala”
Problem
You want to remove elements from a mutable or immutable set in Scala.
Solution
Mutable and immutable sets are handled differently in Scala, as demonstrated in the following examples.
Mutable Sets
When working with a mutable Set
, remove elements from the set using the -=
and --=
methods, as shown in the following examples:
scala> val set = scala.collection.mutable.Set(1, 2, 3, 4, 5) set: scala.collection.mutable.Set[Int] = Set(2, 1, 4, 3, 5) // one element scala> set -= 1 res0: scala.collection.mutable.Set[Int] = Set(2, 4, 3, 5) // two or more elements (-= has a varags field) scala> set -= (2, 3) res1: scala.collection.mutable.Set[Int] = Set(4, 5) // multiple elements defined in another sequence scala> set --= Vector(4,5) res2: scala.collection.mutable.Set[Int] = Set()
You can also use other methods like retain
, clear
, and remove
, depending on your needs:
// retain scala> val set = scala.collection.mutable.Set(1, 2, 3, 4, 5) set: scala.collection.mutable.Set[Int] = Set(2, 1, 4, 3, 5) scala> set.retain(_ > 2) scala> set res0: scala.collection.mutable.Set[Int] = Set(4, 3, 5) // clear scala> val set = scala.collection.mutable.Set(1, 2, 3, 4, 5) set: scala.collection.mutable.Set[Int] = Set(2, 1, 4, 3, 5) scala> set.clear scala> set res1: scala.collection.mutable.Set[Int] = Set() // remove scala> val set = scala.collection.mutable.Set(1, 2, 3, 4, 5) set: scala.collection.mutable.Set[Int] = Set(2, 1, 4, 3, 5) scala> set.remove(2) res2: Boolean = true scala> set res3: scala.collection.mutable.Set[Int] = Set(1, 4, 3, 5) scala> set.remove(40) res4: Boolean = false
As shown, the remove method provides feedback as to whether or not any elements were removed.
Immutable Sets
By definition, when using an immutable Set
you can’t remove elements from it, but you can use the -
and --
operators to remove elements while assigning the result to a new variable:
scala> val s1 = Set(1, 2, 3, 4, 5, 6) s1: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3, 4) // one element scala> val s2 = s1 - 1 s2: scala.collection.immutable.Set[Int] = Set(5, 6, 2, 3, 4) // multiple elements scala> val s3 = s2 - (2, 3) s3: scala.collection.immutable.Set[Int] = Set(5, 6, 4) // multiple elements defined in another sequence scala> val s4 = s3 -- Array(4, 5) s4: scala.collection.immutable.Set[Int] = Set(6)
You can also use all of the filtering methods shown in Chapter 10. For instance, you can use the filter
or take
methods:
scala> val s1 = Set(1, 2, 3, 4, 5, 6) s1: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3, 4) scala> val s2 = s1.filter(_ > 3) s2: scala.collection.immutable.Set[Int] = Set(5, 6, 4) scala> val firstTwo = s1.take(2) firstTwo: scala.collection.immutable.Set[Int] = Set(5, 1)
this post is sponsored by my books: | |||
#1 New Release |
FP Best Seller |
Learn Scala 3 |
Learn FP Fast |