2015-03-31 10 views
5

मेरे पास एक नक्शा है जहां कुंजी एक स्ट्रिंग है और मुझे इस मानचित्र के साथ काम करने से पहले प्रत्येक कुंजी को कम मामले पर रखना होगा।स्कैला - मानचित्र से कम मामले में कुंजी बदलें?

मैं इसे स्कैला पर कैसे कर सकता हूं? मैं कुछ ऐसा था:

var newMap = scala.collection.mutable.Map[String, String]() 
data.foreach(d => newMap +=(d._1.toLowerCase -> d._2)) 

इसके लिए सबसे अच्छा तरीका क्या है?

अग्रिम धन्यवाद।

उत्तर

7

यहां समस्या यह है कि आप म्यूटेबल Map पर निचले-चरण वाली कुंजी जोड़ने की कोशिश कर रहे हैं, जो कि इसमें अतिरिक्त कुंजी ढेर करने जा रहा है। साइड-इफेक्टिंग फ़ंक्शन के बजाय, केवल सख्त map का उपयोग करना बेहतर होगा।

val data = scala.collection.mutable.Map[String, String]("A" -> "1", "Bb" -> "aaa") 
val newData = data.map { case (key, value) => key.toLowerCase -> value } 

आप वास्तव में एक परिवर्तनशील तरह से यह करने के लिए चाहते हैं, तो आप पुराने कुंजी को दूर करने के लिए है।

data.foreach { case (key, value) => 
    data -= key 
    data += key.toLowerCase -> value 
} 

scala> data 
res79: scala.collection.mutable.Map[String,String] = Map(bb -> aaa, a -> 1) 
+0

धन्यवाद, साहब! मैंने एक उदाहरण को चित्रित करने के लिए एक परिवर्तनीय मानचित्र लगाया है :) – placplacboom

+2

इसे दिखाए जाने पर आप जिस तरह से उत्परिवर्तनीय तरीके से दिख रहे हैं, वह थोड़ी डोडी है क्योंकि आप मानचित्र को संशोधित कर रहे हैं क्योंकि आप इसे पुन: सक्रिय कर रहे हैं। प्रभावी रूप से इसका मतलब है कि foreach के शरीर को कई बार निष्पादित किया जा सकता है (आप लॉग जोड़कर इसे आसानी से सत्यापित कर सकते हैं)। इस विशेष मामले में यह परिणाम को प्रभावित नहीं करता है क्योंकि लोअरकेस में कनवर्ट करना बेवकूफ है, लेकिन यह किसी भी गैर-बेवकूफ ऑपरेशन के लिए होने और टूटने की अच्छी आदत नहीं है। –

+0

अच्छा बिंदु। मैं पूरी तरह से परिवर्तनीय मानचित्र से बचना पसंद करता हूं (स्पष्ट रूप से यह मुझे काट सकता था)। –

1

आपका दृष्टिकोण काम करेगा, लेकिन सामान्य रूप में स्काला में परिवर्तन इस तरह का संग्रह में से अपरिवर्तनीय वेरिएंट पसंद किया जाता है के लिए।

आप नीचे दिए गए एक लाइनर के साथ Map वर्ग के map विधि का उपयोग कर सकते हैं:

val m = Map("a"->"A", "B"->"b1", "b"->"B2", "C"->"c") 
m.map(e=>(e._1.toLowerCase,e._2)) 
संबंधित मुद्दे