【问题标题】:Update mutable HashMap value which is a mutable collection更新作为可变集合的可变 HashMap 值
【发布时间】:2012-01-28 00:42:08
【问题描述】:

我有一张如下所示的地图: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 添加到集合的方式的变化(不再是不可变的 List,因此我们不需要创建和分配新集合...)。

但是。这不起作用:incoming(X) += .. 确实为 X 更新地图的值,实际上它并没有改变任何东西。

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

【问题讨论】:

    标签: scala collections map mutable


    【解决方案1】:

    没有找到key时返回默认值,但不会用默认值更新map。你可以使用getOrElseUpdate

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

    这应该可以满足您的需求。

    补充说明:

    如果您关心性能,我认为用ListBuffer 替换List 不会给您带来太多好处,因为您要预先设置List,而且这应该非常快。 ListBuffer 在您想附加到列表时很方便。你应该看看使用java.util.HashMap 看看是否有帮助。

    【讨论】:

    • 关于性能:我担心的不是列表的构建,而是新列表实例的实际创建。此外,按照我的代码垃圾收集的速度,这是一个问题,创建更少的对象肯定会帮助我......
    猜你喜欢
    • 2015-08-05
    • 2012-01-19
    • 2011-03-11
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2017-05-21
    • 1970-01-01
    相关资源
    最近更新 更多