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

Comment le convertir en immuable?Conversion de mutable en carte immuable

+0

I * * suppose que vous créez un nouveau? Juste deviner, mais généralement les choses fonctionnent de cette façon. –

+0

Je ne suis pas sûr de savoir ce que vous voulez dire – Jeriho

+0

hmm .. 'MMMap.toMap'? –

Répondre

56

La hiérarchie immuable ne contient pas de Multimap, donc vous ne serez pas en mesure d'utiliser la structure convertie avec la même syntaxe pratique. Mais si vous êtes heureux de traiter avec des paires clé/ValueSet, puis:

Si vous voulez juste un mutable HashMap, vous pouvez simplement utiliser x.toMap 2.8 ou collection.immutable.Map(x.toList: _*) 2.7.

Mais si vous voulez que la structure entière soit immuable - y compris l'ensemble sous-jacent! - alors vous devez en faire plus: vous devez convertir les ensembles en cours de route. 2.8:

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

2.7:

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

Avec impatience d'attente pour scala 2.8-stable – 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

J'ai été surpris un peu quand j'ai vu "mutableMap.toMap" mais ensuite j'ai vérifié api et je n'ai rien trouvé qui ressemble à. http://www.scala-lang.org/docu/files/api/scala/collection/mutable/HashMap.html Deuxième édition - L'ensemble [B] est modifiable. C'est pourquoi la conversion n'est pas si facile. – Jeriho

+3

@Jeriho: toMap est introduit dans Scala2.8 – Eastsun

+0

Thx Eastsun. Désolé Jeriho, je ne l'ai pas mentionné. –

9

Vous pouvez utiliser myMap.toMap pour convertir un plan en mutable immuable dans Scala 2.8 et les versions ultérieures.

Regarder définition toMap de la documentation:

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

Vous pouvez juste les éléments suivants

val imm_map = MMMap.toMap