首页 > 解决方案 > Scala中具有多个值的可变映射

问题描述

我想要一张地图,以便:

即我需要有一个表格的集合:

k1 -> v1,k1 -> v2,...,k2 -> v1,k2 -> v2,k2 -> v3 等。

归根结底,我需要收集所有这些信息:

k1 -> Seq(v1,v2), ..., k2 -> Seq(v1,v2,v3)

我怎样才能在 Scala 中做到这一点?

编辑

我在 Scastie 试过这个:

val m = new scala.collection.mutable.Map[Int,Int] with scala.collection.mutable.MultiMap[Int,Int]
m += (1 -> 2)
m += (1 -> 3)
m

但我得到:

illegal inheritance;
 <$anon: Int => Int with Int => scala.collection.mutable.Set[Int]> inherits different type instances of trait Map:
scala.collection.mutable.Map[Int,scala.collection.mutable.Set[Int]] and scala.collection.mutable.Map[Int,Int]

trait MultiMap in package mutable is deprecated (since 2.13.0): Use a scala.collection.mutable.MultiDict in the scala-collection-contrib module

标签: scalacollections

解决方案


当人们在 scala 中说“避免使用可变结构”时,它尤其适用于那些必须询问有关如何创建多图的问题的人。我的意思是,这真的不是火箭科学:

    val foo = mutable.Map[Int, List[Int]]().withDefault(_ => Nil)
    foo += 1 -> (1::foo(1))
    foo += 1 -> (2::foo(1))
    foo += 1 -> foo(1).filterNot(Set)
    foo += 1 -> foo(1).tail

    tuples.foreach { case (k,v) => foo += k -> (v::foo(k)) }
    //etc.

但是如果你不得不问如何做到这一点,你很可能最终会错误地使用它(这对于可变结构非常容易)。我强烈建议您坚持使用不可变集合(并避免一般的可变状态),直到您对语言有足够的掌握,能够明确地确定可变实际上是正确解决方案的情况。


推荐阅读