将元素添加到作为地图值的scala集

时间:2011-08-22 15:03:49

标签: scala

我在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中。

3 个答案:

答案 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]

的东西就足够了