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

时间:2011-12-26 14:33:14

标签: scala collections map mutable

我的地图如下: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)
  ..
}

这很好用。现在,我改变了地图的类型,看起来像这样:

var incoming = new collection.mutable.HashMap[A, ListBuffer[B]() {
  override def default(a: A) = collection.mutable.ListBuffer()
}
..
for(b < someCollectionOfBs){
  ..
  incoming(b.getA) += b
  ..
}

请注意第二个示例中元素B如何添加到集合中的更改(不再是不可变列表,因此我们不需要创建和分配新集合......)。

即可。这不起作用:incoming(X) += .. 更新X的地图值,实际上它不会改变任何内容。

我在这里缺少什么?我认为我应该能够更新可变HashMap的值......所以,如果我的值是可变集合,为什么我不能只添加元素?

1 个答案:

答案 0 :(得分:8)

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

incoming.getOrElseUpdate(b.getA, ListBuffer()) += b

那应该做你想要的。

附加说明:

如果您对性能感到担忧,我认为将List替换为ListBuffer并不会给您带来太大的影响,因为您前面是List并且应该非常快。当您想要附加到列表时,ListBuffer很方便。您应该查看使用java.util.HashMap并查看是否有帮助。