La génération d'une fréquence de la carte pour une chaîne en Scala

Disons que j'ai une chaîne de caractères, "bonjour", et je veux générer un personnage de la fréquence de la carte:

Map[Char,Int] = Map(h -> 1, e -> 1, o -> 1, l -> 2)

Je pourrais le faire de manière itérative:

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)
}

Par déconner dans le REPL, j'ai trouvé que je peux faire quelque chose d'un peu plus concis et de ne pas utiliser une mutable collection:

> 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)

Mais je ne connais pas les caractéristiques de performance de groupBy (), ni ce qui se passe dans le bloc transmis à la carte (comme quoi, exactement, p).

Comment dois-je faire idiomatique à l'aide de la fonctionnelle de paradigmes dans la Scala?


Pour le fond, je suis juste venue à la Scala pour la première fois de Ruby. En Ruby, je voudrais utiliser inject mais je ne suis pas sûr de ce que le parallèle moyen de le faire à la Scala est:

counts = str.each_byte.inject(Hash.new(0)){ |h, c| h[c] += 1; h}
InformationsquelleAutor nohat | 2012-08-24