斯卡拉计数字母对

时间:2015-03-18 16:16:43

标签: scala

我是学习Scala的新手,并且会欣赏任何关于以惯用法做出以下方式的想法。我想计算一个单词中连续字母对的出现次数。

例如,对于单词" home",输出可能是Map("ho"->1,"om"->1,"me"->1)。对于' lulu',结果将是Map("lu"->2, "ul"->1 )

因此,执行简单的单字母计数可以作为

完成
"abracadabra".map(s => s).groupBy(identity).mapValues(_.length)

但是我很难过如何添加这个问题的双字母组件。谢谢你的想法。

2 个答案:

答案 0 :(得分:6)

您可以使用.sliding

scala> "abracadabra".sliding(2).toList.groupBy(identity).mapValues(_.length)
res3: scala.collection.immutable.Map[String,Int] = 
        Map(br -> 2, ca -> 1, ab -> 2, ra -> 2, ac -> 1, da -> 1, ad -> 1)

scala> "lulu".sliding(2).toList.groupBy(identity).mapValues(_.length)
res4: scala.collection.immutable.Map[String,Int] = Map(ul -> 1, lu -> 2)

来自文档:

  

滑动:通过传递"滑动窗口来对固定大小的块中的元素进行分组"在他们身上

答案 1 :(得分:1)

您应该使用sliding(2)

"abracadabra".sliding(2).toVector.map(s => s).groupBy(identity).mapValues(_.length)
// Map(br -> 2, ca -> 1, ab -> 2, ra -> 2, ac -> 1, da -> 1, ad -> 1)