fgy*_*ica 3 collections scala mutable map
我的地图看起来像这样:Map[ A -> Collection[B]].这个地图在一个循环中得到更新 - 然而,特殊的是,更新主要只是意味着将一个元素B添加到Collection [B](对于某些键A).
我试图通过将我的Collection的类型从List []更改为ListBuffer []来查明是否可以获得一些加速.
到目前为止,我的代码看起来像这样(简化):
var incoming = new HashMap[A, List[B]() {
override def default(a: A) = List()
}
..
for(b < someCollectionOfBs){
..
incoming(b.getA) = b :: incoming(b.getA)
..
}
Run Code Online (Sandbox Code Playgroud)
这很好用.现在,我改变了地图的类型,使它看起来像这样:
var incoming = new collection.mutable.HashMap[A, ListBuffer[B]() {
override def default(a: A) = collection.mutable.ListBuffer()
}
..
for(b < someCollectionOfBs){
..
incoming(b.getA) += b
..
}
Run Code Online (Sandbox Code Playgroud)
请注意第二个示例中元素B如何添加到集合中的更改(不再是不可变列表,因此我们不需要创建和分配新集合...).
但是.这不起作用:incoming(X) += ..没有没有更新地图为X的值,其实它并没有改变任何东西.
我在这里错过了什么?我认为我应该能够更新可变HashMap的值...所以,如果我的值是可变集合,为什么我不能只添加元素?
未找到密钥时返回默认值,但不会使用默认值更新映射.你可以用getOrElseUpdate它.
incoming.getOrElseUpdate(b.getA, ListBuffer()) += b
Run Code Online (Sandbox Code Playgroud)
那应该做你想要的.
附加说明:
如果你担心的表现,我不认为更换List与ListBuffer你买多少,因为你前面加上一个List这应该是非常快的.ListBuffer当你想要附加到列表时很方便.你应该看看使用java.util.HashMap,看看是否有帮助.
| 归档时间: |
|
| 查看次数: |
1498 次 |
| 最近记录: |