我知道有一个类似的问题,但是我无法弄清楚这个问题的解决方案(我有一个带有不可变集的不可变映射)
我有以下方法,其目的是将一个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。如果映射已经存在,我希望附加到集合,而不是覆盖它
答案 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)
}
}