Skip to content
AgileLogics
5 min read

Sets and Maps

Prerequisites: Tuples, Lists

Set: unique values

@main def sets(): Unit =
  val tags = Set("scala", "jvm", "scala", "fp")
  println(tags.size)
  println(tags.contains("jvm"))
  println(tags + "spark" - "jvm")

  val a = Set(1, 2, 3, 4)
  val b = Set(3, 4, 5)
  println(a intersect b)
  println((a union b).toList.sorted)
  println(a diff b)
3
true
Set(scala, fp, spark)
Set(3, 4)
List(1, 2, 3, 4, 5)
Set(1, 2)

Duplicates are removed automatically; checking membership is fast. Sets have no guaranteed order.

Map: key-value pairs

@main def maps(): Unit =
  val ages = Map("Ada" -> 36, "Linus" -> 28)
  println(ages("Ada"))
  println(ages.get("Grace"))
  println(ages.getOrElse("Grace", 0))
  println(ages.contains("Linus"))

  val updated = ages + ("Grace" -> 45) - "Linus"
  println(updated)
  println(updated.keys.toList.sorted)
36
None
0
true
Map(Ada -> 36, Grace -> 45)
List(Ada, Grace)
  • ages("Ada") looks up a key — and throws if it's missing.
  • get returns an Option: Some(value) or None.
  • getOrElse supplies a default.
  • + and - return new maps.

Looping and transforming

@main def mapOps(): Unit =
  val stock = Map("apples" -> 10, "pears" -> 0, "plums" -> 4)
  for (item, count) <- stock.toList.sortBy(_._1) do
    println(s"$item: $count")
  println(stock.filter((_, count) => count > 0).keys.toList.sorted)
  val doubled = stock.map((item, count) => item -> count * 2)
  println(doubled("plums"))
apples: 10
pears: 0
plums: 4
List(apples, plums)
8

Counting

@main def counting(): Unit =
  val words = List("red", "blue", "red", "green", "red", "blue")
  val counts = words.groupMapReduce(identity)(_ => 1)(_ + _)
  println(counts.toList.sortBy(-_._2))
List((red,3), (blue,2), (green,1))

groupMapReduce groups by a key, maps each element to a value, and combines the values — a one-line word count.