具有可变默认值的可变 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
不保存默认的可变 HashSet
s,我该如何解决这个问题?
声明
hm(42) += 1234
将创建默认值(一个空的 HashSet
),然后通过向其添加 1234 来更新它,然后将其丢弃。
如果要更新 HashMap
本身,请从定义中删除 withDefault
部分,并改用 getOrElseUpdate
:
hm.getOrElseUpdate(42, HashSet.empty[Int]) += 1234
或者,您可以按原样保留 withDefault
,但按如下方式更新哈希映射:
hm(42) = (hm(42) += 1234)
假设我想要一个具有
的可变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
不保存默认的可变 HashSet
s,我该如何解决这个问题?
声明
hm(42) += 1234
将创建默认值(一个空的 HashSet
),然后通过向其添加 1234 来更新它,然后将其丢弃。
如果要更新 HashMap
本身,请从定义中删除 withDefault
部分,并改用 getOrElseUpdate
:
hm.getOrElseUpdate(42, HashSet.empty[Int]) += 1234
或者,您可以按原样保留 withDefault
,但按如下方式更新哈希映射:
hm(42) = (hm(42) += 1234)