计算字母的出现次数,并将字典放在列表中

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (35)

我正在尝试计算字符串流中字母的出现次数,然后在列表中为每个字符串(“字母” - >计数)放置地图。

def checksum(ipt: Stream[String]) =  ipt.foldLeft(List(Map("x"->1)))( (n: 
List[Map[String, Int]], m: String)  => n ++ 
m.split("").groupBy(identity).mapValues(_.size).toMap)

它给出了问题:

 Expression of type List[Equals] doesn't conform to expected type List[Map[String, Int]]

怎么了?就像为每个字符串执行它没有问题:

 def checksum(ipt: Stream[String]) =  ipt.foreach( (m: String)  => println(m.split("").groupBy(identity).mapValues(_.size)))

它给出了类似的东西

val s = "bababc"
val d = "abbcde"
checksum(List(s,d).toStream)
out: 
Map(b -> 3, a -> 2, c -> 1)
Map(e -> 1, a -> 1, b -> 2, c -> 1, d -> 1)

但是我现在如何在列表中存储所有这些地图?我不能使用变量而需要在一个表达式中完成它。

提问于
用户回答回答于

如果您需要每个字符串的映射,您可以使用第一个流上的map函数实现它,如下所示:

 def checksums(ipt: Stream[String]): Stream[Map[Char, Int]] = {
    ipt.map(checksum)
 }

 def checksum(ipt: String): Map[Char, Int] = ipt.foldLeft(Map.empty[Char, Int]) { case (acc, ch) =>
     acc.get(ch) match {
        case Some(q) => acc + (ch -> (q + 1))
        case None => acc + (ch -> 1)
     }
 }

回到你的代码,运算符向List添加一个元素是:+,而不是++。

++用于连接列表。

所以你可以修改你的代码:

def checksumFixed(ipt: Stream[String]) = {
    ipt.foldLeft(List(Map("x"->1))) { (n: List[Map[String, Int]], m: String) =>
      n :+ m.split("").groupBy(identity).mapValues(_.length)
    }
  }

扫码关注云+社区

领取腾讯云代金券