将元素添加到scala集,这是一个IMMUTABLE映射

时间:2014-02-26 20:52:24

标签: list scala set

我知道有一个类似的问题,但是我无法弄清楚这个问题的解决方案(我有一个带有不可变集的不可变映射)

我有以下方法,其目的是将一个Car类型的对象添加到一组Car对象中。带有Map的案例类是:

case class People( demo:Map[Person,Set[Car]] = Map() ) {

其中每个Car对象都有一个类型为person的名称参数,并且具有以下方法,旨在向该组人员添加汽车,返回一个新的People实例。

def +( c:Car ): People = {

每辆车中的名称变量与汽车应该映射到的人物相关联。所以c.name可以用来检索我应该添加汽车的地方的关键。即。

var nameOfPerson  = c.name
demo(nameOfPerson) += c //Complains that += is not a member of Set

我尝试过多种方式添加这款车,包括解决此问题的解决方案:Adding element to a scala set which is a map value

但不幸的是,它一直声明值+ =不是Set的成员。我还尝试将其作为参数添加到返回的实例中:

People(demo + (c.name, c))

但这一直表明需要(?,?),指向c.name ..

非常感谢任何帮助

P.S。如果映射已经存在,我希望附加到集合,而不是覆盖它

1 个答案:

答案 0 :(得分:8)

People(demo + (c.name, c))`
     

但这一直表明需要(?,?),指向c.name ..

问题在于+Map方法的签名,它需要一个键和值的元组,但是括号被“吃掉”作为方法调用括号。以下应该有效:

People(demo + ((c.name, c)))

People(demo + (c.name -> c))

但不是c,而是必须拥有新的套装。所以:

case class People(demo: Map[Person,Set[Car]] = Map()) {
  def + (c: Car): People = {
    val oldSet = demo.getOrElse(c.name, Set.empty)
    val newSet = oldSet + c
    val newMap = demo + (c.name -> newSet)
    People(newMap)
  }
}