2013-07-28 1 views
11

में मानचित्र पर 'मानचित्र' फ़ंक्शन का उपयोग करके पहले, लंगड़ा प्रश्न के लिए क्षमा चाहते हैं। मैं अधीर 'धार्मिक के लिए `स्काला पढ़ रहा हूँ और सभी व्यायाम प्रश्नों को हल करने की कोशिश कर (और कुछ न्यूनतम अन्वेषण कर)स्कैला

पृष्ठभूमि: व्यायाम प्रश्न की तरह हो जाता है - सेटअप के एक नंबर के लिए कीमतों का एक नक्शा gizmos कि आप covet। फिर एक ही कुंजी और कीमतों के साथ एक दूसरे मानचित्र का उत्पादन 10% छूट पर करें।

दुर्भाग्य से, इस बिंदु पर, scaladoc के अधिकांश भागों में अभी भी मेरे लिए गुप्त रहे हैं, लेकिन मैं समझता हूँ कि Map के नक्शे समारोह एक समारोह लेता है और एक समारोह (मुझे लगता है?) लागू करने के बाद एक और नक्शा देता है - def map[B](f: (A) ⇒ B): HashMap[B]। मैं googling की कोशिश की लेकिन map function for Map in scala :-)

मेरे प्रश्न के लिए बहुत उपयोगी परिणाम प्राप्त कर सके: जैसा कि मेरे संस्करण 3 में प्रयास किया, इस उद्देश्य के लिए map फ़ंक्शन का उपयोग करता है कोई मतलब या मैं संस्करण 2 के साथ छड़ी चाहिए जो वास्तव में मेरी समस्या हल करता है।

कोड:

val gizmos:Map[String,Double]=Map("Samsung Galaxy S4 Zoom"-> 1000, "Mac Pro"-> 6000.10, "Google Glass"->2000) 

//1. Normal for/yield 
val discountedGizmos=(for ((k,v)<-gizmos) yield (k, v*0.9)) //Works fine 

//2. Variation using mapValues 
val discGizmos1=gizmos.mapValues(_*0.9) //Works fine 

//3. Variation using only map function 
val discGizmos2=gizmos.map((_,v) =>v*0.9) //ERROR : Wrong number of parameters: expected 1 

उत्तर

15

इस मामले में, mapValues ​​अधिक उपयुक्त विधि का उपयोग प्रतीत होता है। जब आप एक रूपांतरण करने की आवश्यकता होती है तो आपको मानचित्र विधि का उपयोग करना होगा जिसके लिए कुंजी के ज्ञान की आवश्यकता होती है (उदाहरण के लिए, किसी उत्पाद संदर्भ में किसी उत्पाद संदर्भ को परिवर्तित करना)।

उस ने कहा, नक्शा विधि अधिक सामान्य है क्योंकि यह आपको कार्य करने के लिए दोनों कुंजी और मूल्यों के लिए acces देता है, और आप मूल्यों को बदलने और बिना छेड़छाड़ के माध्यम से चाबियाँ पास करके नक्शा मूल्य विधि का अनुकरण कर सकते हैं - और यही वह जगह है जहां आप उपरोक्त कोड में गलत हो रहे हैं। नक्शा विधि सही ढंग से उपयोग करने के लिए, आप अपने समारोह से एक (कुंजी, मूल्य) जोड़ी का निर्माण किया जाना चाहिए, सिर्फ एक कुंजी नहीं:

val discGizmos2=gizmos.map{ case (k,v) => (k,v*0.9) } // pass the key through unchanged 
+0

वाह। यह सही समझ में आता है। स्पष्ट रूप से व्याख्या करने के लिए अपना समय लेने के लिए बहुत बहुत धन्यवाद। –

+1

यह ध्यान देने योग्य है कि 'नक्शा वैल्यू' मौजूदा मानचित्र पर एक दृश्य बनाता है जबकि 'नक्शा' एक नया नया नक्शा बनाता है। – Daenyth

4

यह भी हो सकता है:

val discGizmos2 = gizmos.map(kv => (kv._1, kv._2*0.9)) 
+0

अच्छा। मैं जिस तरह से स्कैला को एक से अधिक तरीकों से एक ही काम करने की अनुमति देता हूं उससे प्यार करता हूं। धन्यवाद !! –

+0

यह एक tuple का उपयोग करने के बराबर है .. यानी केवी बस एक tuple है। – piyushGoyal