2010-05-12 17 views
55
private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B] 

¿Cómo convertirlo a inmutable?Convertir mutable a mapa inmutable

+0

I * * conjetura que crear una nueva? Solo adivinando, pero usualmente las cosas funcionan de esta manera. –

+0

No estoy seguro de qué quiere decir – Jeriho

+0

hmm .. 'MMMap.toMap'? –

Respuesta

56

La jerarquía inmutable no contiene un MultiMap, por lo que no será capaz de utilizar la estructura convertida con la misma sintaxis conveniente. Pero si estás dispuesto a hacer frente a los pares clave/ValueSet, entonces:

Si lo que desea es un mutable HashMap, sólo puede utilizar x.toMap en 2.8 o 2.7 en collection.immutable.Map(x.toList: _*).

Pero si quieres que toda la estructura sea inmutable, incluido el conjunto subyacente, entonces tienes que hacer más: necesitas convertir los juegos en el camino. En 2.8:

x.map(kv => (kv._1,kv._2.toSet)).toMap 

en 2.7:

collection.immutable.Map(
    x.map(kv => (kv._1,collection.immutable.Set(kv._2.toList: _*))).toList: _* 
) 
+1

Con impaciencia a la espera de scala 2.8-estable – Jeriho

24
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" 
       ^
+0

Me sorprendió un poco cuando vi "mutableMap.toMap" pero luego verifiqué API y no encontré nada parecido. http://www.scala-lang.org/docu/files/api/scala/collection/mutable/HashMap.html Segundo problema: el conjunto [B] es mutable. Es por eso que la conversión no es tan fácil. – Jeriho

+3

@Jeriho: toMap se presenta en Scala2.8 – Eastsun

+0

Thx Eastsun. Lo siento, Jeriho, no lo mencioné. –

9

Se puede utilizar para convertir un myMap.toMap un mapa mutable en inmutable en Scala 2.8 y versiones posteriores.

En cuanto a definición de toMap de documentación:

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 
} 
2

Puede simplemente a la siguiente

val imm_map = MMMap.toMap 
Cuestiones relacionadas