2015-04-11 3 views
6

documentation on Map.flatten राज्यों निम्नलिखित:स्कैला: Map.flatten के लिए केस का उपयोग करें?

एक नक्शे के इन traversable संग्रह के तत्वों द्वारा गठित में traversable संग्रह में से इस नक्शे में बदलता है।

मुझे "ट्रैवर्स संग्रहों का नक्शा" मिलता है। उदाहरण के लिए, यह सूचियों का नक्शा होगा। अकेले उस परिभाषा से, Map[Int, List[Int]] योग्य होगा।

लेकिन "इन ट्रैवर्स संग्रहों के तत्वों द्वारा गठित नक्शा" क्या है? यह सीधा लगता है, लेकिन मुझे इसे काम करने में मुश्किल हो रही है।

प्रलेखन में प्रदान किया गया उदाहरण कोड है ... अच्छा ... क्या हम कहेंगे, लागू नहीं हैं?

val xs = List(
      Set(1, 2, 3), 
      Set(1, 2, 3) 
     ).flatten 
// xs == List(1, 2, 3, 1, 2, 3) 

val ys = Set(
      List(1, 2, 3), 
      List(3, 2, 1) 
     ).flatten 
// ys == Set(1, 2, 3) 

मैं कुछ अलग अलग बातें की कोशिश की है, लेकिन वे एक ही त्रुटि उपज। यहां कुछ उदाहरण दिए गए हैं:

scala> val m = Map(List(1) -> List(1,2,3), List(2) -> List(4,5,6), List(3) -> List(7,8,9)) 
m: scala.collection.immutable.Map[List[Int],List[Int]] = Map(List(1) -> List(1, 2, 3), List(2) -> List(4, 5, 6), List(3) -> List(7, 8, 9)) 

scala> m.flatten 
<console>:9: error: No implicit view available from (List[Int], List[Int]) => scala.collection.GenTraversableOnce[B]. 
       m.flatten 
       ^

scala> val m = Map(1 -> List(1,2,3), 2 -> List(4,5,6), 4 -> List(7,8,9)) 
m: scala.collection.immutable.Map[Int,List[Int]] = Map(1 -> List(1, 2, 3), 2 -> List(4, 5, 6), 4 -> List(7, 8, 9)) 

scala> m.flatten 
<console>:9: error: No implicit view available from (Int, List[Int]) => scala.collection.GenTraversableOnce[B]. 
       m.flatten 
       ^

मुझे क्या याद आ रही है?

उत्तर

4

समस्या यह है कि संकलक मानचित्र में संग्रहीत तत्वों की व्याख्या करने के बारे में "नहीं जानता"। यही है, व्याख्या स्पष्ट नहीं है, इसलिए आपको तत्वों के अपने स्वयं के अंतर्निहित दृष्टिकोण को एक ट्रैवर्सबल में प्रदान करना होगा। उदाहरण के लिए, आपके द्वारा प्रदान किए जाने वाले मामले के लिए, आप (Int, List[Int]) के मानचित्र के प्रत्येक तत्व को संभवतः टुपल्स की एक नई सूची में समझना चाहते हैं जिसमें पहला तत्व मूल तत्व कुंजी है और मान मूल रूप से दिए गए मानों में से प्रत्येक मान है कुंजी का मूल्य कोड में:

implicit val flattener = (t: (Int,List[Int])) ⇒ t._2.map(x ⇒ (t._1, x)) 

val m = Map(1 → List(1, 2, 3), 2 → List(4, 5), 3 → List(6)) 
val fm = m.flatten 

लेकिन आपको "फ़्लैटिंग" फ़ंक्शन स्वयं प्रदान करना होगा।

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