scala - 字符串中的字符数
问题描述
一般来说,我是 scala 和 FP 的新手,并试图在一个虚拟示例上进行练习。
val counts = ransomNote.map(e=>(e,1)).reduceByKey{case (x,y) => x+y}
引发以下错误:
Line 5: error: value reduceByKey is not a member of IndexedSeq[(Char, Int)] (in solution.scala)
上面的例子看起来类似于盯着 FP Primer on word count,如果你指出我的错误,我将不胜感激。
解决方案
看起来您正在尝试在 Scala 集合上使用 Spark 方法。这两个 API 有一些相似之处,但reduceByKey
不是其中的一部分。
在纯 Scala 中,您可以这样做:
val counts =
ransomNote.foldLeft(Map.empty[Char, Int].withDefaultValue(0)) {
(counts, c) => counts.updated(c, counts(c) + 1)
}
foldLeft
从左侧迭代集合,使用计数的空映射作为累积状态(返回 0 是没有找到值),它在作为参数传递的函数中通过更新找到的值进行更新,递增。
请注意,counts(c)
在大多数情况下,直接访问地图 ( ) 可能是不安全的(因为如果未找到任何项目,它将引发异常)。在这种情况下很好,因为在这个范围内我知道我正在使用具有默认值的地图。访问地图时,您通常不想使用get
,它返回一个Option
. 更多关于官方 Scala 文档的信息(这里是 2.13.2 版)。
您可以在 Scastie 上使用此代码。
推荐阅读
- django - 如何在 django 中保存自定义 ModelForm 字段
- python - 如何进行“X 轴”或更多可视化?
- javascript - react中如何用钩子替换基于类的组件
- python - 错误:点:无法打开 ast.dot:没有这样的文件或目录 ...同时使用 python 使用 graphviz 创建 pdf 文件
- reactjs - 如何在饼图中添加工具提示?
- javascript - 迭代步数大于 1 时匹配 js 中的迭代值
- android - Android/sqlite - 带有用户输入的 ContentResolver 查询
- flutter - FLUTTER - DRAGGABLE & DRAG TARGET - 如何处理“on will accept”和“on accept”参数
- node.js - 节点:node-pre-gyp npm install Erreur?
- javascript - 我在验证更新时遇到问题(快递)