private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B]
Wie konvertiere ich es in unveränderlich?
Die unveränderliche Hierarchie enthält keine MultiMap, sodass Sie die konvertierte Struktur nicht mit der gleichen praktischen Syntax verwenden können. Wenn Sie sich jedoch gerne mit Schlüssel/Wertemengen-Paaren befassen, gilt Folgendes:
Wenn Sie nur eine veränderbare HashMap
möchten, können Sie einfach x.toMap
In 2.8 oder collection.immutable.Map(x.toList: _*)
in 2.7 verwenden.
Aber wenn Sie möchten, dass die gesamte Struktur - einschließlich der zugrunde liegenden Menge! - unveränderlich ist, müssen Sie mehr tun: Sie müssen die Mengen auf dem Weg konvertieren. In 2.8:
x.map(kv => (kv._1,kv._2.toSet)).toMap
In 2.7:
collection.immutable.Map(
x.map(kv => (kv._1,collection.immutable.Set(kv._2.toList: _*))).toList: _*
)
scala> val mutableMap = new HashMap[Int, String]
mutableMap: scala.collection.mutable.HashMap[Int,String] = Map()
scala> mutableMap += 1 -> "a"
res5: mutableMap.type = Map((1,a))
scala> mutableMap
res6: scala.collection.mutable.HashMap[Int,String] = Map((1,a))
scala> val immutableMap = mutableMap.toMap
immutableMap: scala.collection.immutable.Map[Int,String] = Map((1,a))
scala> immutableMap += 2 -> "b"
<console>:11: error: reassignment to val
immutableMap += 2 -> "b"
^
Sie können myMap.toMap
, um eine veränderbare Karte in unveränderlich in Scala 2.8 und neuere Versionen umzuwandeln.
Betrachtet man die Definition von toMap
aus der Dokumentation:
def toMap[T, U](implicit ev: A <:< (T, U)): immutable.Map[T, U] = {
val b = immutable.Map.newBuilder[T, U]
for (x <- self) b += x
b.result
}
Sie können nur zu den folgenden
val imm_map = MMMap.toMap