Konvertieren von veränderlichen in unveränderliche Karten


Antworten:


70

Die unveränderliche Hierarchie enthält keine MultiMap, sodass Sie die konvertierte Struktur nicht mit derselben praktischen Syntax verwenden können. Wenn Sie sich jedoch gerne mit Schlüssel / Wertesatz-Paaren befassen, dann:

Wenn Sie nur eine veränderbare Version möchten HashMap, können Sie diese x.toMapin 2.8 oder collection.immutable.Map(x.toList: _*)2.7 verwenden.

Wenn Sie jedoch möchten, dass die gesamte Struktur unveränderlich ist - einschließlich der zugrunde liegenden Menge! -, 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: _*
)

29
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"
                ^

Ich war ein bisschen überrascht, als ich "mutableMap.toMap" sah, aber dann überprüfte ich die API und fand nichts Ähnliches. scala-lang.org/docu/files/api/scala/collection/mutable/… Zweite Ausgabe - Set [B] ist veränderlich. Deshalb ist das Konvertieren nicht so einfach.
Jeriho

3
@ Jeriho: toMap wird in Scala2.8
Eastsun

Thx Eastsun. Entschuldigung Jeriho, ich habe es nicht erwähnt.
michael.kebe

12

Sie können myMap.toMapeine veränderbare Karte in Scala 2.8 und späteren Versionen in unveränderliche konvertieren.

Betrachtet man die Definition von toMapaus 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
}

8

Sie können nur zu folgendem

val imm_map = MMMap.toMap

Dies lässt das SetVeränderliche; Sie können das Ergebnis nicht mutieren Map, aber Sie können dasSet
Abhijit Sarkar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.