Konvertieren von veränderlichen in unveränderliche Karten

75
private[this]object MMMap extends  HashMap[A, Set[B]] with MultiMap[A, B]

Wie konvertiere ich es in unveränderlich?

Jeriho
quelle
Ich denke du erstellst einen neuen? Nur raten, aber normalerweise funktionieren die Dinge so.
o0 '.
Ich bin nicht sicher, was du meinst
Jeriho
3
hmm .. MMMap.toMap?
Dmitry Bespalov

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: _*
)
Rex Kerr
quelle
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"
                ^
michael.kebe
quelle
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
}
Fahad Siddiqui
quelle
8

Sie können nur zu folgendem

val imm_map = MMMap.toMap
Harish Gajapathy
quelle
Dies lässt das SetVeränderliche; Sie können das Ergebnis nicht mutieren Map, aber Sie können dasSet
Abhijit Sarkar