Scala:使用具有默认值的HashMap

时间:2010-09-06 03:37:14

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

4 个答案:

答案 0 :(得分: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 = ""

答案 1 :(得分:35)

试试这个:

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

然后:

scala> x(1)
res7: String = b

scala> x(2)
res8: String = a

scala> x(3)
res9: String = c

scala> x(4)
res10: String = -

答案 2 :(得分:1)

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

可能有更好的方法来做到这一点。等待其他人回复。

答案 3 :(得分:0)

我更像是一个java家伙...但如果getOrElse不是最终的,为什么不延伸HasMap并提供类似的内容:

override def getOrElse(k: Int, default: String) = {
  return super.getOrElse(k,"_")
}

注意:语法可能搞砸了,但希望你能明白这一点