我是学习Scala的新手,并且会欣赏任何关于以惯用法做出以下方式的想法。我想计算一个单词中连续字母对的出现次数。
例如,对于单词" home",输出可能是Map("ho"->1,"om"->1,"me"->1)
。对于' lulu',结果将是Map("lu"->2, "ul"->1 )
。
因此,执行简单的单字母计数可以作为
完成"abracadabra".map(s => s).groupBy(identity).mapValues(_.length)
但是我很难过如何添加这个问题的双字母组件。谢谢你的想法。
答案 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)