2011-01-31 21 views
19

मैं एक मानचित्र ("ए", "बी", "सी") को मानचित्र में कैसे बदलूं ("ए" -> 1, "बी" -> 2, "सी" -> 3)? मुझे लगता है कि इसे टोमैप के साथ काम करना चाहिए।स्कैला कनवर्ट करें मानचित्र पर सेट करें

+2

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

उत्तर

30

zipWithIndex शायद आप जो खोज रहे हैं वह शायद है। यह आपके संग्रह पत्रों को संग्रहित करेगा और संग्रह में स्थिति के साथ मिलान मूल्य, टुपल्स का एक नया संग्रह करेगा। आप एक अतिरिक्त आवश्यकता हालांकि है - ऐसा लगता है कि अपने पदों 0 के बजाय, 1 के साथ शुरू, ताकि आप उन tuples को बदलने के लिए की आवश्यकता होगी:

Set("a","b","c") 
    .zipWithIndex //(a,0), (b,1), (c,2) 
    .map{case(v,i) => (v, i+1)} //increment each of those indexes 
    .toMap //toMap does work for a collection of Tuples 

एक अतिरिक्त विचार - सेट स्थिति को बनाए रखने नहीं है। अगर आप ऊपर की स्थिति को लगातार काम करना चाहते हैं तो सूची जैसे संरचना का उपयोग करने पर विचार करें। एक और समाधान 1 से शुरू सभी प्राकृतिक संख्या का एक Stream का उपयोग करता है अपने Set साथ ज़िप किया जा करने के लिए

+0

यही वही था जो मैं चाहता था। धन्यवाद। –

7

टोपैप केवल तभी काम करता है जब सेट एंटीज कुंजी/वैल्यू जोड़े (जैसे सेट (("ए", 1), ("बी", 2), ("सी", 3))। आप क्या चाहते हैं पाने के लिए, zipWithIndex का उपयोग करें:

scala> Set("a","b","c") zipWithIndex 
    res5: scala.collection.immutable.Set[(java.lang.String, Int)] = Set((a,0), (b,1), (c,2)) 

संपादित करें: या (यदि आप मूल प्रश्न में के रूप में :))

scala> Set("a","b","c") zip (1 to 3) toMap 

EDIT2: ओह, मुझे अंत में toMap भूल गया!

19

यहाँ है:

scala> Set("a", "b", "c") zip Stream.from(1) toMap 
Map((a,1), (b,2), (c,3)) 
+0

+1, यह सबसे अच्छा जवाब है। – missingfaktor

2

यह भी होगा काम:

(('a' to 'c') zip (1 to 3)).toMap 
संबंधित मुद्दे