Скажем, у меня есть строка, "привет", и я хочу создать частотную карту символов:
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() и того, что происходит в блоке, переданном на карту (например, что именно, p).
Как я могу сделать это с помощью функциональных парадигм в Scala?
Для фона, я просто прихожу к Scala в первый раз из Ruby. В Ruby я использовал бы inject
, но я не уверен, что параллельный способ сделать это в Scala:
counts = str.each_byte.inject(Hash.new(0)){ |h, c| h[c] += 1; h}