Oop Scala:使用具有默认值的HashMap

Oop Scala:使用具有默认值的HashMap,oop,data-structures,scala,hashmap,Oop,Data Structures,Scala,Hashmap,我有一个可变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, "

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

scala> val x = HashMap(1 -> "b", 2 -> "a", 3 -> "c").withDefaultValue("-")
x: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,b), (2,a), (3,c))

scala> x(3)
res0: java.lang.String = c

scala> x(5)
res1: java.lang.String = -
编辑:

对于
mutable.HashMap
,您可以执行以下操作:

scala> import collection.mutable
import collection.mutable

scala> val x = new mutable.HashMap[Int, String] {
     |   override def apply(key: Int) = super.get(key) getOrElse "-"
     | }
x: scala.collection.mutable.HashMap[Int,String] = Map()

scala> x += (1 -> "a", 2 -> "b", 3 -> "c")
res9: x.type = Map((2,b), (1,a), (3,c))

scala> x(2)
res10: String = b

scala> x(4)
res11: String = -

也许有更好的方法可以做到这一点。等待其他人的回应。

我更像一个java人。。。但是如果
getOrElse
不是final,为什么不扩展
HasMap
并提供如下内容:

override def getOrElse(k: Int, default: String) = {
  return super.getOrElse(k,"_")
}
注意:语法可能有问题,但希望您能理解这一点

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


哇,在我把最后一个答案贴在这里整整一年后,我碰巧访问了这个帖子。:-)

Scala 2.9.1
mutable.Map
附带了一个
withDefaultValue
方法。答复会议:

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 = ""

是的,我认为可以扩展HashMap。在这种情况下,更改HashMap.default方法以返回所需内容可能会更容易。构造函数可以接受默认值,HashMap.default方法将返回该值。但是,我希望有一个更简单的方法。我们不这样做,因为它比
getOrElse
更复杂-它灵活性较低,不必要地冗长,如果必须这样做,这强烈表明您应该使用一些高级抽象,类似于幺半群。@PythonPower:您在原始问题中没有指定使用的是
mutable.HashMap
。我不知道如何使用
mutable.HashMap
。我必须研究一下API。是的,很抱歉我没有具体说明——我已经编辑了我的问题,现在把它弄清楚了。+1。想知道为什么
mutable.HashMap
没有像
immutable.HashMap
那样提供一个
withDefaultValue
方法。这是一种可怕的语法,但它做到了。可能应该将可变哈希映射缺少withDefaultValue报告为一个bug?中相邻的WithDefaultWithCode>中有一条“!!!todo:移动到常规映射?”注释。因此,这可能不是太长。scala用户邮件列表可能是查询此问题并查看是否应报告错误的好地方。@PythonPower已提交一份增强通知单。感谢您的报告!看到Scala得到如此积极的改进真是太好了。对于任何偶然发现这个问题的人,missingfaktor的帖子都正确地指出“Scala 2.9.1.mutable.Map附带了一个withDefaultValue方法”,我担心这方面的性能-mutable.Map是否使用HashMaps?其性能如何?
WithDefault
仅覆盖
default
方法(因此仅影响
apply
),并在找不到键时返回默认值。其他所有内容都将发送到基础
映射
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 = ""