我一般是 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 入门,如果您指出我的错误,我将不胜感激。
看起来您正在尝试在 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 上使用此代码。
| 归档时间: |
|
| 查看次数: |
65 次 |
| 最近记录: |