首页 > 解决方案 > 字符串中的字符数

问题描述

一般来说,我是 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

解决方案


看起来您正在尝试在 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 上使用此代码。


推荐阅读