2014-02-26 133 views
3

我知道有一个类似的问题问,但我不能找出解决这个问题(如果我有一个不变的设置不变地图)添加元素阶集这是一个不可变的映射

我有以下方法,它旨在将一个Car类型的对象添加到一组Car对象中。与Map的情况下类:

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

,每一个汽车对象有型人的名字参数,它具有以下方法,旨在车添加到组的人,返回的新实例人。

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

但不幸的是,它不断声称一套价值+ =不是一个成员。我也尝试添加作为参数到返回的实例:

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

但这一直声称是必需的,指向c.name ..

任何帮助是很大的(?,?)赞赏

PS我期待追加到集合,如果映射已经存在,不能覆盖它

回答

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) 
    } 
} 
相关问题