我可以计算此Scala片段中1个循环中的出现次数吗?

Jan*_*ulp 1 scala

我有一个简单的Scala代码.我循环遍历一个字符串列表,我想计算每个字符串的出现,我收集为列表r中的元组(String,Int).主函数中的部分应该保留(所以没有groupBy或者什么).我的问题是关于更新功能:

现在我先做一个find,然后在r中添加一个新元组,如果它不存在的话.如果确实存在,我循环遍历r并更新匹配String的计数器.

可以修改更新功能,以便更有效吗?可以在一次迭代中更新(如果它不存在则添加,如果它存在则更新计数器)?

谢谢

var r = List[(String, Int)]() // (string, count)

def update(s: String, l: List[(String, Int)]) : List[(String, Int)] = {
  if (r.find(a => a._1  == s) == None) {
    (s, 1) :: r // add a new item if it does not exist
  } else {
    for (b <- l) yield {
      if (b._1 == s) {
        (b._1, b._2 + 1) // update counter if exists
      } else {
        b // just yield if no match
      }
    }
  }
}

def main(args : Array[String]) : Unit = {
  val l = "A" :: "B" :: "A" :: "C" :: "A" :: "B" :: Nil

  for (s <- l) r = update(s, r)

  r foreach println
}
Run Code Online (Sandbox Code Playgroud)

Hei*_*ger 22

我建议你去寻找功能风格并使用Scala集合的强大功能:

ss.groupBy(identity).mapValues(_.size)
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案经常出现,它应该放在核心库中.我称之为'tally`的方法. (4认同)
  • `s => s`被预定义为`identity` (2认同)