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

इसे अपरिवर्तनीय रूप में कैसे परिवर्तित करें?परिवर्तनीय मानचित्र में परिवर्तनीय कनवर्ट करना

+0

को मैं * कर सकते हैं अनुमान * यदि आप एक नया बना? बस अनुमान लगाते हैं, लेकिन आमतौर पर चीजें इस तरह से काम करती हैं। –

+0

मुझे यकीन नहीं है कि आपका क्या मतलब है – Jeriho

+0

हम्म .. 'MMMap.toMap'? –

उत्तर

56

अपरिवर्तनीय पदानुक्रम एक मल्टीमैप शामिल नहीं है, ताकि आप एक ही सुविधाजनक वाक्य रचना के साथ परिवर्तित संरचना का उपयोग करने में सक्षम नहीं होगा। लेकिन अगर आप कुंजी/valueset जोड़े, तो से निपटने के लिए खुश हैं:

तुम सिर्फ एक परिवर्तनशील HashMap चाहते हैं, तो आप सिर्फ x.toMap 2.8 या collection.immutable.Map(x.toList: _*) में 2.7 में उपयोग कर सकते हैं।

लेकिन यदि आप पूरी संरचना को अपरिवर्तनीय सेट करना चाहते हैं - अंतर्निहित सेट सहित! - तो आपको और करना होगा: आपको सेट को कन्वर्ट करने की आवश्यकता है। 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

घोटाला 2.8-स्थिर के लिए प्रतीक्षा में असंतोष के साथ – 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

जब मैंने "mutableMap.toMap" देखा तो मैं थोड़ा आश्चर्यचकित हुआ लेकिन फिर मैंने एपीआई सत्यापित की और मुझे कुछ भी नहीं मिला। http://www.scala-lang.org/docu/files/api/scala/collection/mutable/HashMap.html दूसरा मुद्दा - सेट [बी] उत्परिवर्तनीय है। यही कारण है कि कनवर्ट करना इतना आसान नहीं है। – Jeriho

+3

@ जेरिहो: टोपी को स्कैला 2.8 – Eastsun

+0

थैक्स ईस्ट्सुन में पेश किया गया है। क्षमा करें जेरिको, मैंने इसका उल्लेख नहीं किया। –

9

आप myMap.toMap का उपयोग स्काला 2.8 और बाद के संस्करणों में अपरिवर्तनीय में एक एक परिवर्तनशील नक्शा कन्वर्ट करने के लिए कर सकते हैं।

प्रलेखन से toMap की परिभाषा को देखते हुए:

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

तुम बस निम्नलिखित

val imm_map = MMMap.toMap