2016-11-05 22 views
5

मैं स्कैला के लिए नया हूं और मानचित्र पर मानचित्र फ़ंक्शन का प्रयास कर रहा हूं।स्कैला - मानचित्र फ़ंक्शन - केवल मानचित्र के अंतिम तत्व को वापस लौटा

scala> val map1 = Map ("abc" -> 1, "efg" -> 2, "hij" -> 3) 
    map1: scala.collection.immutable.Map[String,Int] = 
      Map(abc -> 1, efg -> 2, hij -> 3) 

यहां पर नक्शे समारोह और परिणाम है::

scala> val result1 = map1.map(kv => (kv._1.toUpperCase, kv._2)) 
    result1: scala.collection.immutable.Map[String,Int] = 
      Map(ABC -> 1, EFG -> 2, HIJ -> 3) 

यहाँ है एक और नक्शा समारोह और परिणाम:

scala> val result1 = map1.map(kv => (kv._1.length, kv._2)) 
    result1: scala.collection.immutable.Map[Int,Int] = Map(3 -> 3) 

पहला नक्शा समारोह रिटर्न यहाँ मेरी मानचित्र है अपेक्षित सभी सदस्यों हालांकि दूसरा नक्शा फ़ंक्शन केवल मानचित्र का अंतिम सदस्य देता है। क्या कोई यह समझा सकता है कि यह क्यों हो रहा है?

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

उत्तर

8

स्कैला में, Map में डुप्लिकेट कुंजी नहीं हो सकती हैं। जब आप key -> value को Map पर जोड़ते हैं, तो वह कुंजी पहले से मौजूद है, तो आप पिछले मान को ओवरराइट करते हैं। यदि आप संग्रह पर कार्यात्मक संचालन से मानचित्र बना रहे हैं, तो आप प्रत्येक अद्वितीय कुंजी के अंतिम उदाहरण के अनुरूप मान के साथ समाप्त होने जा रहे हैं। आपके द्वारा लिखे गए उदाहरण में, मूल मानचित्र map1 की प्रत्येक स्ट्रिंग कुंजी एक ही लंबाई है, और इसलिए आपकी सभी स्ट्रिंग कुंजियां result1 के लिए समान पूर्णांक कुंजी 3 उत्पन्न करती हैं। क्या हुड के नीचे हो रहा है की गणना करने के result1 है:

  1. एक नया, रिक्त नक्शा
  2. बनाई गई है आप 3 -> 3 को "abc" -> 1 नक्शा और मानचित्र में जोड़ें। परिणाम में अब 1 -> 3 शामिल है।
  3. आप "efg" -> 2 से 3 -> 2 पर नक्शा जोड़ें और इसे मानचित्र में जोड़ें। चूंकि कुंजी वही है, इसलिए आप मौजूदा मान को key = 3 के लिए ओवरराइट करते हैं। परिणाम में अब 2 -> 3 शामिल है।
  4. आप "hij" -> 3 से 3 -> 3 पर नक्शा और इसे मानचित्र में जोड़ें। चूंकि कुंजी वही है, इसलिए आप मौजूदा मान को key = 3 के लिए ओवरराइट करते हैं। परिणाम में अब 3 -> 3 शामिल है।
  5. परिणाम लौटें, जो Map(3 -> 3 है) `।

नोट: मैंने एक सरल धारणा की है कि मानचित्र इटेटरेटर में तत्वों का क्रम घोषणा के अनुसार आपके द्वारा लिखे गए आदेश के समान है। आदेश हैश बिन द्वारा निर्धारित किया गया है और शायद आपके द्वारा जोड़े गए तत्वों के क्रम से मेल नहीं खाएगा, इसलिए इस धारणा पर निर्भर कुछ भी न बनाएं।

+0

बहुत बहुत धन्यवाद, टिम! – chandlerlx

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