2011-06-29 5 views
19

अन्य संग्रहों से scala.collection.Map निर्माण, मैं लगातार पाते हैं अपने आप कोस्काला मानचित्र iterable

val map = Map(foo.map(x=>(x, f(x)))

हालांकि लेखन, यह वास्तव में काम नहीं करता है के बाद से Map.apply चर तर्क केवल लेता है - तो मैं

लिखने के लिए है

val map = Map(foo.map(x=>(x, f(x)) toSeq :_*)

जो मैं चाहता हूं उसे प्राप्त करने के लिए, लेकिन यह दर्दनाक लगता है। क्या को Iterable टुपल्स से बनाने का कोई शानदार तरीका है?

उत्तर

28

TraversableOnce.toMap का उपयोग करें जो परिभाषित किया गया है कि ट्रैवर्सबल/इटेबल के तत्व Tuple2 प्रकार के हैं। (API)

val map = foo.map(x=>(x, f(x)).toMap 
+1

या, 'foo.mapValues ​​(च) .toMap'। – missingfaktor

+0

@missingfaktor नक्शा नक्शा के अलावा अन्य कक्षाओं के लिए एक तरीका है? – juanchito

+0

@ मायानेस, नहीं, लेकिन मुझे लगता है कि उस समय मुझे कोई बेहतर पता नहीं था! :) – missingfaktor

4

वैकल्पिक रूप से आप map कॉल करने के लिए अंतर्निहित CanBuildFrom तर्क के रूप में उपयोग collection.breakOut उपयोग कर सकते हैं; यह अपेक्षित प्रकार के आधार पर परिणाम निर्माता चुन देगा।

scala> val x: Map[Int, String] = (1 to 5).map(x => (x, "-" * x))(collection.breakOut) 
x: Map[Int,String] = Map(5 -> -----, 1 -> -, 2 -> --, 3 -> ---, 4 -> ----) 

यह .toMap संस्करण की तुलना में बेहतर प्रदर्शन करेगा, के रूप में यह केवल एक बार संग्रह iterates।

यह इतना स्पष्ट नहीं है, लेकिन यह समझ के लिए भी काम करता है।

scala> val x: Map[Int, String] = (for (i <- (1 to 5)) yield (i, "-" * i))(collection.breakOut) 
x: Map[Int,String] = Map(5 -> -----, 1 -> -, 2 -> --, 3 -> ---, 4 -> ----) 
+0

इसके लिए धन्यवाद - जबकि मैं इसे कोड में उपयोग नहीं कर रहा हूं कि अन्य लोगों को 'CanBuildFrom' पागलपन के कई स्पष्टीकरण के लिंक में पेस्ट किए बिना पढ़ना है, यह * उस मामले के लिए उपयोगी है जहां मैं चाहता हूं एक अपरिवर्तनीय रेंज को 'mutable.Map' में परिवर्तित करने के लिए, जहां मैंने जवाब दिया है, मुझे पहले एक प्रकार की त्रुटि देता है। – themel