我在Scala中有以下地图:
var m = Map[Int,Set[Int]]()
m += 1 -> Set(1)
m(1) += 2
我发现最后一行不起作用。我得到“错误:重新分配到val”。
所以我试过
var s = m(1)
s += 2
然后,当我在添加2之后将m(1)
与s
进行比较时,它们的内容就不同了。那么如何将一个元素添加到一个集合中,这是一个地图的值?
我来自Java / C ++背景,所以我尝试的对我来说似乎很自然,但显然它不在Scala中。
答案 0 :(得分:10)
您可能正在使用immutable.Map
。您需要使用mutable.Map
,或者替换该集合,而不是使用另一个不可变映射进行修改。
以下是mutable vs immutable data structures。
的说明参考因此...
import scala.collection.mutable.Map
var m = Map[Int,Set[Int]]()
m += 1 -> Set(1)
m(1) += 2
答案 1 :(得分:4)
除了@Stefan回答: 而不是使用可变的Map,您可以使用可变的Set
import scala.collection.mutable.{Set => mSet}
var m = Map[Int,mSet[Int]]()
m += 1 -> mSet(1)
m(1)+=2
mSet是为了减少冗长而引入的可变Set的快捷方式。
scala> m
res9: scala.collection.immutable.Map[Int,scala.collection.mutable.Set[Int]] = Map(1 -> Set(2, 1))
答案 2 :(得分:4)
我认为你真正想要的是MultiMap
import collection.mutable.{Set, Map, HashMap, MultiMap}
val m = new HashMap[Int,Set[Int]] with MultiMap[Int, Int]
m.addBinding(1,1)
m.addBinding(1,2)
m.addBinding(2,3)
请注意,m
本身是val
,因为它是地图本身,现在是可变的,而不是对地图的引用
此时,m
现在将成为:
Map(
1 -> Set(1,2),
2 -> Set(3)
)
不幸的是,没有与MultiMap不可变的等价物,你有来指定你将在施工时使用的mutable.Map
的具体子类。
对于所有后续操作,只需输入类型为MultiMap[Int,Int]