字符串中的字符数

Dan*_*nko 1 scala

我一般是 Scala 和 FP 的新手,并试图在一个虚拟示例上练习它。

val counts = ransomNote.map(e=>(e,1)).reduceByKey{case (x,y) => x+y}
Run Code Online (Sandbox Code Playgroud)

出现以下错误:

Line 5: error: value reduceByKey is not a member of IndexedSeq[(Char, Int)] (in solution.scala)
Run Code Online (Sandbox Code Playgroud)

上面的示例看起来类似于在字数上盯着 FP 入门,如果您指出我的错误,我将不胜感激。

ste*_*ino 6

看起来您正在尝试在 Scala 集合上使用 Spark 方法。这两个 API 有一些相似之处,但reduceByKey不是其中的一部分。

在纯 Scala 中,您可以这样做:

val counts =
  ransomNote.foldLeft(Map.empty[Char, Int].withDefaultValue(0)) {
    (counts, c) => counts.updated(c, counts(c) + 1)
  }
Run Code Online (Sandbox Code Playgroud)

foldLeft 从左侧迭代集合,使用计数的空映射作为累积状态(返回 0 表示没有找到值),在作为参数传递的函数中更新,通过使用找到的值进行更新,递增。

请注意,counts(c)在大多数情况下,直接访问地图 ( ) 可能是不安全的(因为如果没有找到项目,它将抛出异常)。在这种情况下很好,因为在这个范围内我知道我正在使用具有默认值的地图。访问地图时,您通常不想使用get,它返回一个Option. 有关官方 Scala 文档的更多信息(此处为 2.13.2 版)。

您可以在 Scastie 上使用此代码。