具有可变默认值的可变 HashMap 不保留更改

Mutable HashMap with a mutable default value doesn't keep the changes

假设我想要一个具有

的可变 HashMap[Int, HashSet[Int]]

我希望每当访问或更新新键的值时默认创建一个空的可变 HashSet

这是我尝试过的:

import collection.mutable.{HashMap, HashSet}

val hm = HashMap
  .empty[Int, HashSet[Int]]
  .withDefault(_ => HashSet.empty[Int])

hm(42) += 1234

println(hm)

意外的结果是空的 HashMap。我期待一个带有 (42 -> HashSet(1234)) 键值对的哈希映射。

为什么 HashMap 不保存默认的可变 HashSets,我该如何解决这个问题?

声明

hm(42) += 1234

将创建默认值(一个空的 HashSet),然后通过向其添加 1234 来更新它,然后将其丢弃。


如果要更新 HashMap 本身,请从定义中删除 withDefault 部分,并改用 getOrElseUpdate

hm.getOrElseUpdate(42, HashSet.empty[Int]) += 1234

或者,您可以按原样保留 withDefault,但按如下方式更新哈希映射:

hm(42) = (hm(42) += 1234)