更新可变HashMap值,这是一个可变集合

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的值...所以,如果我的值是可变集合,为什么我不能只添加元素?

huy*_*hjl 8

未找到密钥时返回默认值,但不会使用默认值更新映射.你可以用getOrElseUpdate它.

incoming.getOrElseUpdate(b.getA, ListBuffer()) += b
Run Code Online (Sandbox Code Playgroud)

那应该做你想要的.

附加说明:

如果你担心的表现,我不认为更换ListListBuffer你买多少,因为你前面加上一个List这应该是非常快的.ListBuffer当你想要附加到列表时很方便.你应该看看使用java.util.HashMap,看看是否有帮助.