2012-02-16 14 views
36

LinkedHashMap मानचित्र में सम्मिलन आदेश को संरक्षित करने के लिए उपयोग किया जाता है, लेकिन यह केवल परिवर्तनीय मानचित्रों के लिए काम करता है। कौन सा अपरिवर्तनीय Map कार्यान्वयन है जो सम्मिलन आदेश को संरक्षित करता है?अपरिवर्तनीय स्कैला मानचित्र कार्यान्वयन जो सम्मिलन आदेश

+1

यह एक सटीक डुप्लिकेट नहीं है, सवाल अपरिवर्तनीय मानचित्र के लिए है, कथित डुप्लिकेट उत्परिवर्तनीय और अपरिवर्तनीय दोनों के बारे में है। दूसरा सवाल * सीधे * अपरिवर्तनीय भाग का जवाब नहीं देता है (शायद अप्रत्यक्ष रूप से) –

उत्तर

41

ListMap सूची-आधारित डेटा संरचना का उपयोग करके एक अपरिवर्तनीय मानचित्र लागू करता है, और इस प्रकार सम्मिलन आदेश को संरक्षित करता है।

scala> import collection.immutable.ListMap 
import collection.immutable.ListMap 

scala> ListMap(1 -> 2) + (3 -> 4) 
res31: scala.collection.immutable.ListMap[Int,Int] = Map(1 -> 2, 3 -> 4) 

scala> res31 + (6 -> 9) 
res32: scala.collection.immutable.ListMap[Int,Int] = Map(1 -> 2, 3 -> 4, 6 -> 9) 

निम्नलिखित विस्तार विधि - जब ListMap रों के साथ काम करने Seq#toListMap काफी उपयोगी हो सकता है।

scala> import scalaz._, Scalaz._, Liskov._ 
import scalaz._ 
import Scalaz._ 
import Liskov._ 

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

implicit def seqW[A](xs: Seq[A]) = new SeqW(xs) 
class SeqW[A](xs: Seq[A]) { 
    def toListMap[B, C](implicit ev: A <~< (B, C)): ListMap[B, C] = { 
    ListMap(co[Seq, A, (B, C)](ev)(xs) : _*) 
    } 
} 


// Exiting paste mode, now interpreting. 

seqW: [A](xs: Seq[A])SeqW[A] 
defined class SeqW 

scala> Seq((2, 4), (11, 89)).toListMap 
res33: scala.collection.immutable.ListMap[Int,Int] = Map(2 -> 4, 11 -> 89) 
+1

मौजूदा कुंजी * परिवर्तन * वस्तुओं के क्रम के साथ ListMap - कॉलिंग अपडेट() के साथ एक गॉचा है। उदाहरण: 'सूची मैप ("ए" → 1, "बी" → 2)। अद्यतित ("ए", 2)। सूची' उपज 'सूची ((बी, 2), (ए, 2)) '। मेरे उपयोग के मामले के लिए बहुत दुर्भाग्यपूर्ण :( –

20

ListMap प्रविष्टि क्रम बनाए रखने के करते हैं, यह बहुत ही कुशल नहीं है - जैसे लुकअप समय रैखिक है। मेरा सुझाव है कि आप एक नया संग्रह वर्ग बनाएं जो immutable.HashMap और immutable.TreeMap दोनों को लपेटता है। अपरिवर्तनीय मानचित्र को immutable.HashMap[Key, (Value, Long)] के रूप में parametrized किया जाना चाहिए, जहां tuple में Long आपको TreeMap[Long, Key] में इसी प्रविष्टि के सूचक को देता है। फिर आप पक्ष में एक प्रवेश काउंटर रखें। यह पेड़ नक्शा प्रविष्टि आदेश के अनुसार प्रविष्टियों को सॉर्ट करेगा।

आप सीधे तरीके से सम्मिलन और लुकअप को लागू करते हैं - काउंटर को बढ़ाते हैं, हैश मानचित्र में डालें और काउंटर-कुंजी जोड़ी को ट्रेमैप में डालें। आप लुकअप के लिए हैश मानचित्र का उपयोग करते हैं।

आप वृक्ष मानचित्र का उपयोग करके पुनरावृत्ति लागू करते हैं।

निकालने के लिए, आपको हैश मानचित्र से कुंजी-मूल्य जोड़ी को हटाना होगा और पेड़ मानचित्र से संबंधित प्रविष्टि को निकालने के लिए ट्यूपल से अनुक्रमणिका का उपयोग करना होगा।

+3

+1। निकट भविष्य में stdlib में ऐसा संग्रह करने का कोई मौका? – missingfaktor

+0

यह योजना नहीं बनाई गई है, लेकिन यदि स्कैला आंतरिक मेलिंग सूची पर चर्चा से पता चला कि बहुत से लोग इसे चाहते हैं , तो क्यों नहीं। – axel22

+1

क्या आप विस्तारित करना चाहते हैं क्यों? – axel22

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