Scala:使用具有默认值的HashMap

31 oop scala hashmap data-structures

我有一个可变的HashMap,并希望像默认字典一样使用它.显而易见的方法似乎是使用getOrElse并每次提供默认值作为第二个值.然而,在我的用例中,这似乎有点不合适,因为默认值不会改变.

var x = HashMap(1 -> "b", 2 -> "a", 3 -> "c")

println(x.getOrElse(4, "_")
println(x.getOrElse(5, "_"))
// And so on...
println(x.getOrElse(10, "_"))
Run Code Online (Sandbox Code Playgroud)

有没有办法创建一个HashMap(或类似的类),以便尝试访问未定义的键返回创建HashMap时设置的默认值?我注意到HashMap.default只是设置为抛出一个异常,但我想知道这是否可以改变...

mis*_*tor 70

哇,我在这里发布最后一个答案后一年就碰巧访问了这个帖子.:-)

Scala 2.9.1.mutable.Map附带一种withDefaultValue方法.REPL会议:

scala> import collection.mutable
import collection.mutable

scala> mutable.Map[Int, String]().withDefaultValue("")
res18: scala.collection.mutable.Map[Int,String] = Map()

scala> res18(3)
res19: String = ""
Run Code Online (Sandbox Code Playgroud)


huy*_*hjl 35

试试这个:

import collection.mutable.HashMap
val x = new HashMap[Int,String]()  { override def default(key:Int) = "-" }
x += (1 -> "b", 2 -> "a", 3 -> "c")
Run Code Online (Sandbox Code Playgroud)

然后:

scala> x(1)
res7: String = b

scala> x(2)
res8: String = a

scala> x(3)
res9: String = c

scala> x(4)
res10: String = -
Run Code Online (Sandbox Code Playgroud)

  • +1.不知道为什么`mutable.HashMap`没有像`immutable.HashMap`那样提供`withDefaultValue`方法. (4认同)
  • 有一个"!!! todo:移动到一般地图?" 在http://www.scala-lang.org/api/current/scala/collection/immutable/Map.html中的邻居`withDefault`中发表评论.所以可能这不是太多的延伸.scala-user邮件列表可能是查询此问题并查看是否应报告错误的好地方. (4认同)
  • @PythonPower提交了一张增强票据http://lampsvn.epfl.ch/trac/scala/ticket/3829. (3认同)
  • 这是一种可怕的语法,但它确实可以解决问题.也许缺少可变HashMaps的withDefaultValue应该报告为bug? (2认同)