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

use*_*248 3 scala list set

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

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

case class People( demo:Map[Person,Set[Car]] = Map() ) {
Run Code Online (Sandbox Code Playgroud)

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

def +( c:Car ): People = {
Run Code Online (Sandbox Code Playgroud)

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

var nameOfPerson  = c.name
demo(nameOfPerson) += c //Complains that += is not a member of Set
Run Code Online (Sandbox Code Playgroud)

我尝试过多种方式添加这款车,包括在这个问题中提出的解决方案:将元素添加到scala集中,这是一个映射值

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

People(demo + (c.name, c))
Run Code Online (Sandbox Code Playgroud)

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

任何帮助是极大的赞赏

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

0__*_*0__ 8

People(demo + (c.name, c))`
Run Code Online (Sandbox Code Playgroud)

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

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

People(demo + ((c.name, c)))
Run Code Online (Sandbox Code Playgroud)

要么

People(demo + (c.name -> c))
Run Code Online (Sandbox Code Playgroud)

但是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)
  }
}
Run Code Online (Sandbox Code Playgroud)