【问题标题】:How to use getOrElseUpdate in scala.collection.mutable.HashMap?如何在 scala.collection.mutable.HashMap 中使用 getOrElseUpdate?
【发布时间】:2016-10-07 11:31:24
【问题描述】:

示例代码计算给定输入文件中每个单词的出现次数:

object Main {
  def main(args: Array[String]) {
    val counts = new scala.collection.mutable.HashMap[String, Int]
    val in = new Scanner(new File("input.txt"))

    while (in.hasNext()) {
      val s: String = in.next()
      counts(s) = counts.getOrElse(s, 0) + 1 // Here!
    }

    print(counts)
  }
}

可以使用getOrElseUpdate 方法重写带有注释突出显示的行吗?

附:我只是在“不耐烦的 Scala”的第 4 部分,所以请不要现在教我函数式 Scala,我敢肯定,这里可以更漂亮。

谢谢。

【问题讨论】:

  • 代码的意图是什么?要统计文本文件中的字符数?

标签: scala dictionary hashmap


【解决方案1】:

如果您查看doc,您会看到下一个:

如果给定的键已经在这个映射中,返回相关的值。 否则,从给定的表达式 op 计算值,用 key in 存储 映射并返回该值。

,不过还是要修改地图,所以getOrElseUpdate在这里没用。

你可以定义default的值,如果key不存在就会返回。并用下一种方式:

import scala.collection.mutable.HashMap
object Main {
  def main(args: Array[String]) {
    val counts = HashMap[String, Int]().withDefaultValue(0)
    val in = new Scanner(new File("input.txt"))

    while (in.hasNext()) {
      val s: String = in.next()
      counts(s) += 1
    }

    print(counts)
  }
}

【讨论】:

  • 不错的方法,但你必须在val counts = HashMap[String, Int]().withDefaultValue(0)之后加上括号
猜你喜欢
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 2021-06-04
  • 2017-01-30
  • 2016-10-01
  • 2018-02-20
  • 2017-09-10
相关资源
最近更新 更多