【发布时间】:2014-02-05 06:59:40
【问题描述】:
我正在尝试理解this answer,与使用默认值的地图有关:
val lists = new mutable.HashMap[String,List[Int]].withDefaultValue(Nil)
lists("dog") ::= 13
lists("cat") ::= 14
lists("dog") ::= 15 //(13, 15)
据我了解,scala 使用“嵌套”函数来表示不可变列表。一个不幸的副作用是迭代不可变列表以 reverse order 返回元素。
为避免顺序相反,我尝试使用 ArrayBuffer 来实现:
val lists = new mutable.HashMap[String,mutable.ArrayBuffer[Int]].withDefault(_=>ArrayBuffer())
lists("dog").append(1)
println( lists("dog") ) //prints "ArrayBuffer()"
很遗憾,这不起作用。看来scala实际上并没有把默认值放回地图上,而是一直返回空的ArrayBuffers
最后,我使用了以下代码:
val lists1 = new mutable.HashMap[String,mutable.ArrayBuffer[Int]]
val lists= lists1.withDefault( x=>{val n= mutable.ArrayBuffer[Int](); lists1(x)=n; n})
这可行,但似乎不必要地复杂。有没有更好的解决方案?
【问题讨论】: