Maps, Sets, and Grouping
Counting Frequencies
Count how often each value appears.
frequency-count
A frequency count builds a map from each value to its running tally. Each step reads the current count and stores one more.
Counting Frequencies
FrequencyCount.scala
Replay: real traced execution (multi-file project)
object Main {
def main(args: Array[String]): Unit = {
val target = 2
val items = List(1, 2, 2, 3, 2, 1)
var counts = Map[Int, Int]()
for (n <- items) {
val current = counts.getOrElse(n, 0)
counts = counts + (n -> (current + 1))
}
val targetCount = counts.getOrElse(target, 0)
println("distinct=" + counts.size)
println("targetCount=" + targetCount)
}
}
object Main {
def main(args: Array[String]): Unit = {
val target = 1
val items = List(1, 2, 2, 3, 2, 1)
var counts = Map[Int, Int]()
for (n <- items) {
val current = counts.getOrElse(n, 0)
counts = counts + (n -> (current + 1))
}
val targetCount = counts.getOrElse(target, 0)
println("distinct=" + counts.size)
println("targetCount=" + targetCount)
}
}
object Main {
def main(args: Array[String]): Unit = {
val target = 3
val items = List(1, 2, 2, 3, 2, 1)
var counts = Map[Int, Int]()
for (n <- items) {
val current = counts.getOrElse(n, 0)
counts = counts + (n -> (current + 1))
}
val targetCount = counts.getOrElse(target, 0)
println("distinct=" + counts.size)
println("targetCount=" + targetCount)
}
}
target ← 2, items ← List(1, 2, 2, 3, 2, 1), counts ← Map()
1object Main {2 def main(args: Array[String]): Unit = {3 val target→ 2 = 2 //@target=1, 34 val items→ List(1, 2, 2, 3, 2, 1) = List(1, 2, 2, 3, 2, 1)5 var counts→ Map() = Map[Int, Int]()6 for (n <- items) {7 val current = counts.getOrElse(n, 0)current ← 0, counts ← Map(1 -> 1)
pass 1 of 65var counts = Map[Int, Int]()6for (n1 <- itemsList(1, 2, 2, 3, 2, 1)) {7 val current→ 0 = countsMap().getOrElse(n1, 0)8 counts→ Map(1 -> 1) = counts + (n1 -> (current0 + 1))9}10val targetCount = counts.getOrElse(target, 0)All 6 passes — pass 1 is the card above pass ncurrentcounts1 1 0 Map() → Map(1 -> 1) 2 2 0 Map(1 -> 1) → Map(1 -> 1, 2 -> 1) 3 2 1 Map(1 -> 1, 2 -> 1) → Map(1 -> 1, 2 -> 2) 4 3 0 Map(1 -> 1, 2 -> 2) → Map(1 -> 1, 2 -> 2, 3 -> 1) 5 2 2 Map(1 -> 1, 2 -> 2, 3 -> 1) → Map(1 -> 1, 2 -> 3, 3 -> 1) 6 1 1 Map(1 -> 1, 2 -> 3, 3 -> 1) → Map(1 -> 2, 2 -> 3, 3 -> 1) targetCount ← 3
9 }10 val targetCount→ 3 = countsMap(1 -> 2, 2 -> 3, 3 -> 1).getOrElse(target2, 0)1112 println("distinct=" + counts.size3)13 println("targetCount=" + targetCount3)14 }15}outputdistinct=3 targetCount=3
target ← 1, items ← List(1, 2, 2, 3, 2, 1), counts ← Map()
1object Main {2 def main(args: Array[String]): Unit = {3 val target→ 1 = 14 val items→ List(1, 2, 2, 3, 2, 1) = List(1, 2, 2, 3, 2, 1)5 var counts→ Map() = Map[Int, Int]()6 for (n <- items) {7 val current = counts.getOrElse(n, 0)current ← 0, counts ← Map(1 -> 1)
pass 1 of 65var counts = Map[Int, Int]()6for (n1 <- itemsList(1, 2, 2, 3, 2, 1)) {7 val current→ 0 = countsMap().getOrElse(n1, 0)8 counts→ Map(1 -> 1) = counts + (n1 -> (current0 + 1))9}10val targetCount = counts.getOrElse(target, 0)All 6 passes — pass 1 is the card above pass ncurrentcounts1 1 0 Map() → Map(1 -> 1) 2 2 0 Map(1 -> 1) → Map(1 -> 1, 2 -> 1) 3 2 1 Map(1 -> 1, 2 -> 1) → Map(1 -> 1, 2 -> 2) 4 3 0 Map(1 -> 1, 2 -> 2) → Map(1 -> 1, 2 -> 2, 3 -> 1) 5 2 2 Map(1 -> 1, 2 -> 2, 3 -> 1) → Map(1 -> 1, 2 -> 3, 3 -> 1) 6 1 1 Map(1 -> 1, 2 -> 3, 3 -> 1) → Map(1 -> 2, 2 -> 3, 3 -> 1) targetCount ← 2
9 }10 val targetCount→ 2 = countsMap(1 -> 2, 2 -> 3, 3 -> 1).getOrElse(target1, 0)1112 println("distinct=" + counts.size3)13 println("targetCount=" + targetCount2)14 }15}outputdistinct=3 targetCount=2
target ← 3, items ← List(1, 2, 2, 3, 2, 1), counts ← Map()
1object Main {2 def main(args: Array[String]): Unit = {3 val target→ 3 = 34 val items→ List(1, 2, 2, 3, 2, 1) = List(1, 2, 2, 3, 2, 1)5 var counts→ Map() = Map[Int, Int]()6 for (n <- items) {7 val current = counts.getOrElse(n, 0)current ← 0, counts ← Map(1 -> 1)
pass 1 of 65var counts = Map[Int, Int]()6for (n1 <- itemsList(1, 2, 2, 3, 2, 1)) {7 val current→ 0 = countsMap().getOrElse(n1, 0)8 counts→ Map(1 -> 1) = counts + (n1 -> (current0 + 1))9}10val targetCount = counts.getOrElse(target, 0)All 6 passes — pass 1 is the card above pass ncurrentcounts1 1 0 Map() → Map(1 -> 1) 2 2 0 Map(1 -> 1) → Map(1 -> 1, 2 -> 1) 3 2 1 Map(1 -> 1, 2 -> 1) → Map(1 -> 1, 2 -> 2) 4 3 0 Map(1 -> 1, 2 -> 2) → Map(1 -> 1, 2 -> 2, 3 -> 1) 5 2 2 Map(1 -> 1, 2 -> 2, 3 -> 1) → Map(1 -> 1, 2 -> 3, 3 -> 1) 6 1 1 Map(1 -> 1, 2 -> 3, 3 -> 1) → Map(1 -> 2, 2 -> 3, 3 -> 1) targetCount ← 1
9 }10 val targetCount→ 1 = countsMap(1 -> 2, 2 -> 3, 3 -> 1).getOrElse(target3, 0)1112 println("distinct=" + counts.size3)13 println("targetCount=" + targetCount1)14 }15}outputdistinct=3 targetCount=1