【问题标题】:Adding element to a scala set which is a map value将元素添加到作为映射值的 scala 集中
【发布时间】:2011-11-01 05:50:39
【问题描述】:

我在 Scala 中有以下地图:

var m = Map[Int,Set[Int]]()
m += 1 -> Set(1)
m(1) += 2

我发现最后一行不起作用。我收到“错误:重新分配给 val”。

所以我尝试了

var s = m(1)
s += 2

然后当我将m(1)s 添加2 后进行比较时,它们的内容不同。那么如何将元素添加到作为地图值的集合中?

我来自 Java/C++ 背景,所以我尝试的东西对我来说似乎很自然,但显然它不是在 Scala 中。

【问题讨论】:

    标签: scala


    【解决方案1】:

    您可能正在使用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
    

    【讨论】:

    • 具体来说,使用以下行分配您的可变映射:collection.mutable.Map[Int, Set[Int]]()
    【解决方案2】:

    除了@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))
    

    【讨论】:

    • import scala.collection._ 为您提供更具描述性的快捷方式:mutable.Set
    【解决方案3】:

    我认为你真正想要的是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] 的东西就足够了

    【讨论】:

      猜你喜欢
      • 2014-03-29
      • 2014-03-14
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      相关资源
      最近更新 更多