我知道有一个类似的问题,但我无法弄清楚这个问题的解决方案(我有一个不可变集的不可变映射)
我有以下方法,其目的是将一个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如果映射已经存在,我希望附加到集合,而不是覆盖它
Run Code Online (Sandbox Code Playgroud)People(demo + (c.name, c))`但这一直表明需要(?,?),指向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)