2010-02-03 8 views
22

मेरे पास दो सूचियां हैं, List[A] और List[B]। मैं चाहता हूं कि Map[A,B] है लेकिन मैं zip के अर्थशास्त्र चाहता हूं। तो इसलिए की तरह बाहर शुरू कर दिया:स्कैला में, क्या दो सूचियों को मानचित्र में बदलने का कोई तरीका है?

var tuplesOfAB = listOfA zip listOfB 

अब मुझे यकीन है कि कैसे मेरे tuplesOfAB से एक Map निर्माण करने के लिए नहीं कर रहा हूँ।

एक अनुवर्ती प्रश्न के रूप में, मैं भी अपने मानचित्र को उलटा करना चाहता हूं ताकि Map[A,B] से मैं Map[B,A] बना सकता हूं। क्या कोई मुझे एक सुराग छड़ी के साथ मारा सकता है?

+1

इस पूछने के लिए धन्यवाद। मैं इसे खोजने के लिए यहां आया था। अब मुझे खुद से यह पूछना नहीं है। – wheaties

उत्तर

26

2,8 में यह वास्तव में CanBuildFrom कार्यक्षमता (as described by Daniel) का उपयोग कर और breakOut क्या परिणाम प्रकार होना चाहिए के रूप में संकलक को अनुदेश एक प्रकार के साथ प्रयोग सरल है:

import scala.collection.breakOut 
val m = (listA zip listB)(breakOut): Map[A,B] 

निम्नलिखित होगा यह भी काम:

val n: Map[A,B] = (listA zip listB)(breakOut) 

और (जैसा कि ईस्टसुन ने नीचे बताया है) इसे जोड़ा गया है पुस्तकालय के रूप में toMap

val o = (listA zip listB).toMap 

नक्शा पलटने के लिए के रूप में, आप कर सकते हैं:

val r = m.map(_.swap)(breakOut): Map[B, A] 
+4

वैल एम = (सूची ए ज़िप सूची बी) टोपी स्कैला 2.8 – Eastsun

+0

आह में भी काम करता है! यह विधि 2.8 के निर्माण में मौजूद नहीं है जो मेरे पास है (आर 20327) –

+1

हां, इसे हाल ही में जोड़ा गया था क्योंकि पाउप ने दिखाया है कि इसे किसी अन्य प्रश्न के जवाब में लिखना कितना आसान था। उसके बाद उन्होंने इसे lib में जोड़ने का सुझाव दिया, क्योंकि हर दूसरे प्रमुख संग्रह का पहले ही प्रतिनिधित्व किया गया था। –

15

अब आपके पास टुपल्स की एक सूची है, इसे Map(tuplesOfAB: _*) लिखकर इसे मानचित्र में बनाना आसान है। : _* नोटेशन का मतलब अनुक्रम से लिया गया तर्कों के साथ varargs अधिभार को कॉल करना है। यह वाक्यविन्यास के एक मजेदार बिट की तरह लगता है, लेकिन यह सोचने में मदद करता है कि varargs Map[A,B](pairs: (A,B)*) की तरह घोषित किए गए हैं और : _* सामान्य * भाग के कारण varargs में कनवर्ट करने के लिए एक प्रकार की एनोटेशन है।

मानचित्र को वापस करने के लिए mMap(m.map(_.swap): _*) का उपयोग करें। स्कैला में एक नक्शा भी जोड़ों का संग्रह है। यह तत्वों को स्वैप करके और उन्हें मानचित्र कन्स्ट्रक्टर में पास करके उन जोड़ों को बदल देता है।

+0

यह सुंदर है, धन्यवाद! –

5

वहाँ अभी तक एक और तरीका यह करने के लिए, पहले से ही दिखाया उन से परे है। यहाँ:

Map() ++ tuplesOfAB 
4
scala> List("a", "f", "d") zip List(7, 5, 4, 8) toMap 
res0: scala.collection.immutable.Map[java.lang.String,Int] = Map(a -> 7, f -> 5, d -> 4)