Генерация частотной карты для строки в Scala
Допустим, у меня есть строка "привет", и я хочу сгенерировать карту частот символов:
Map[Char,Int] = Map(h -> 1, e -> 1, o -> 1, l -> 2)
Я мог бы сделать это итеративно:
val str = "hello"
var counts = new scala.collection.mutable.HashMap[Char,Int]
for (i <- str) {
if (counts.contains(i))
counts.put(i, counts(i) + 1)
else
counts.put(i, 1)
}
Пошарив в REPL, я обнаружил, что могу сделать что-то более лаконичное, не используя изменяемую коллекцию:
> str.groupBy(_.toChar).map{ p => (p._1, p._2.length)}
scala.collection.immutable.Map[Char,Int] = Map(h -> 1, e -> 1, o -> 1, l -> 2)
Но я не знаю ни о характеристиках производительности groupBy (), ни о том, что происходит в блоке, переданном в map (например, что такое p).
Как мне сделать это идиоматически, используя функциональные парадигмы в Scala?
Для справки, я впервые приезжаю в Scala из Ruby. В Ruby я бы использовалinject
но я не уверен, что параллельный способ сделать это в Scala:
counts = str.each_byte.inject(Hash.new(0)){ |h, c| h[c] += 1; h}