2011-02-18 11 views
70

मैं अपरिवर्तनीय रूपांतरित कैसे कर सकता हूं। मैप करने योग्य करने के लिए मैप। स्कैला में मैप ताकि मैं मानचित्र में मान अपडेट कर सकूं?मैं अपरिवर्तनीय कैसे परिवर्तित कर सकता हूं। मैप करने योग्य करने के लिए मैप। Scala में मैप?

उत्तर

29
val myImmutableMap = collection.immutable.Map(1->"one",2->"two") 
val myMutableMap = collection.mutable.Map() ++ myImmutableMap 
+0

क्या आप जानते हैं कि टोपी एसिम्प्टोटिक समय जटिलता है? मुझे पता है कि क्लोजर अपने किसी भी लगातार संग्रह को "क्षणिक" में बदल सकता है (यानी रैखिक रूप से टाइप किए गए उत्परिवर्तन कार्यों के साथ एक उत्परिवर्तनीय) और वापस 'ओ (1)' चरणों में लगातार एक में बदल सकता है। यह * ओ (एन) 'होने के लिए दिखता है, हालांकि यह निश्चित रूप से इस बात पर निर्भर करता है कि' ++ 'के कार्यान्वयन को कितना चालाक है। –

+0

@ जोर्ग - मुझे पूरा यकीन है कि यह एक 'ओ (एन) 'है। सीमा में जब आप सबकुछ बदलते हैं, तो यह 'ओ (एन)' होना चाहिए, हालांकि आप समय बचाने के लिए नई प्रतिलिपि के निर्माण को स्थगित करने का प्रयास कर सकते हैं, या आप मूल मानचित्र के बजाय परिवर्तनों को पढ़कर अपने एक्सेस समय को दोगुना कर सकते हैं। कौन सा सबसे अच्छा प्रदर्शन करता है शायद आपके उपयोग के मामले पर निर्भर करता है। –

+1

@ रुस्तम - मानचित्र अनियंत्रित हैं। वे जो भी आदेश महसूस करते हैं, वे दिखाई देंगे (हैश मानचित्र के साथ, यह आमतौर पर हैश कुंजी का क्रम है)। विशेष रूप से, अपरिवर्तनीय मानचित्रों में वास्तव में छोटे नक्शे के लिए विशेष मामले होते हैं जो परिवर्तनीय मानचित्रों से अलग होते हैं। –

3

collection.breakOut का उपयोग करने के बारे में कैसे?

import collection.{mutable, immutable, breakOut} 
val myImmutableMap = immutable.Map(1->"one",2->"two") 
val myMutableMap: mutable.Map[Int, String] = myImmutableMap.map(identity)(breakOut) 
+0

यह * कूल * है, लेकिन मूल रूप से वही काम करता है जैसे 'mutable.Map # apply' थोड़ा और बॉयलरप्लेट के साथ। –

0

वहाँ एक खाली परिवर्तनशील Map अपरिवर्तनीय Map से लिया मूलभूत मूल्यों है कि बनाने के लिए एक संस्करण है। आप एक मूल्य की दुकान और किसी भी समय डिफ़ॉल्ट ओवरराइड हो सकता है:

scala> import collection.immutable.{Map => IMap} 
//import collection.immutable.{Map=>IMap} 

scala> import collection.mutable.HashMap 
//import collection.mutable.HashMap 

scala> val iMap = IMap(1 -> "one", 2 -> "two") 
//iMap: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,one), (2,two)) 

scala> val mMap = new HashMap[Int,String] {  
    | override def default(key: Int): String = iMap(key) 
    | } 
//mMap: scala.collection.mutable.HashMap[Int,String] = Map() 

scala> mMap(1) 
//res0: String = one 

scala> mMap(2) 
//res1: String = two 

scala> mMap(3) 
//java.util.NoSuchElementException: key not found: 3 
// at scala.collection.MapLike$class.default(MapLike.scala:223) 
// at scala.collection.immutable.Map$Map2.default(Map.scala:110) 
// at scala.collection.MapLike$class.apply(MapLike.scala:134) 
// at scala.collection.immutable.Map$Map2.apply(Map.scala:110) 
// at $anon$1.default(<console>:9) 
// at $anon$1.default(<console>:8) 
// at scala.collection.MapLike$class.apply(MapLike.scala:134).... 

scala> mMap(2) = "three" 

scala> mMap(2)   
//res4: String = three 

चेतावनी (रेक्स केर द्वारा टिप्पणी देखें):

: आप तत्वों अपरिवर्तनीय नक्शे से आ रही दूर करने के लिए सक्षम नहीं होगा
scala> mMap.remove(1) 
//res5: Option[String] = None 

scala> mMap(1) 
//res6: String = one 
+2

यह कुछ मामलों में उपयोगी है, लेकिन ध्यान दें कि आप अपने नए मानचित्र में मौजूद तत्व को निकालने में असमर्थ हैं जो आपके डिफ़ॉल्ट मानचित्र में मौजूद था; आप केवल डिफ़ॉल्ट को कवर और उजागर कर सकते हैं। –

+0

सही, यह समाधान आंशिक है। –

92

सबसे साफ तरीका mutable.Map varargs कारखाना का उपयोग करना होगा। ++ दृष्टिकोण के विपरीत, इस CanBuildFrom तंत्र का उपयोग करता है, और इसलिए की क्षमता है और अधिक कुशल होने के लिए करता है, तो पुस्तकालय कोड इस का लाभ लेने के लिए लिखा गया था:

val m = collection.immutable.Map(1->"one",2->"Two") 
val n = collection.mutable.Map(m.toSeq: _*) 

यह काम करता है क्योंकि एक Map भी एक दृश्य के रूप में देखी जा सकती है जोड़े के

+0

क्या आप समझा सकते हैं, पैरामीटर पास करते समय दूसरी पंक्ति में आप किस वाक्यविन्यास का उपयोग करते हैं? कोलन क्या करता है? – Heinzi

+5

': _ *' टाइप प्रकार की तरह है, संकलक को बताता है कि किसी दिए गए अभिव्यक्ति के लिए वास्तव में किस प्रकार का प्रतीक है। आप यहां इस बारे में सोच सकते हैं कि "यह अनुक्रम लें, और इसे कई vararg पैरा के रूप में देखें।" –

+12

संग्रह पुस्तकालयों में कुछ गड़बड़ है यदि यह सबसे साफ है;) – matanster

संबंधित मुद्दे