2009-11-27 7 views
6

स्कैला में, groupBy() पर एक संग्रह पर कॉलिंग Map देता है जहां मान संग्रह होते हैं, लेकिन मुझे MultiMap चाहिए। रूपांतरण करने का सबसे आसान तरीका क्या है? क्या मैं एक नया MultiMap बनाने और सब कुछ कॉपी करने से बच सकता हूं?क्या मुझे स्कैला विशेषता में मिश्रण करने के लिए एक नई वस्तु बनाना है?

उत्तर

5

मुझे लगता है कि "क्या मुझे स्केल विशेषता में मिश्रण करने के लिए एक नई वस्तु बनाना है?" हां है"। आप कुछ को लपेटने वाली वस्तुओं और निहित रूपांतरणों के साथ दर्द को कम कर सकते हैं।


अपने विशिष्ट समस्या के लिए, मैं GroupBy (...) मजबूर करने के लिए परिवर्तनशील सेट है, जो आप "मल्टीमैप साथ MapProxy" के साथ लपेट करने की आवश्यकता होगी करने के लिए एक परिवर्तनशील नक्शे को वापस करने में असमर्थ था।

package blevins.example 

object App extends Application { 

    implicit def multiMapable[B](c: Iterable[B]) = new { 
    def groupByMM[A](f: B => A) = { 
     import scala.collection.mutable._ 
     val ret = new HashMap[A,Set[B]] with MultiMap[A,B] 
     for (e <- c) { ret.addBinding(f(e), e) } 
     ret 
    } 
    } 

    val c = List(1,2,3,4,5,6,7,8,9) 
    val mm = c.groupByMM { i => if (i < 5) "alpha" else "beta" } 
    mm.addBinding("alpha",12) 
    println(mm) // Map(beta -> Set(5, 7, 6, 9, 8), alpha -> Set(3, 1, 4, 2, 12)) 

} 

परिशिष्ट

यहाँ है एक मौजूदा मानचित्र लपेटकर [स्ट्रिंग, सेट का एक उदाहरण: लेकिन, यह नहीं कोड की भी कई लाइनों "GroupBy" के अपने स्वयं के संस्करण को लागू करने की है [इंट]] एक मल्टीमैप में मूल्यों को कॉपी किए बिना:

object App extends Application { 
    import scala.collection.mutable._ 
    val seed: Map[String,Set[Int]] = Map("even" -> Set(2,4,6), "odd" -> Set(1,3,5)) 

    val multiMap = new MapProxy[String,Set[Int]] with MultiMap[String,Int] { 
    val self = seed 
    } 

    multiMap.addBinding("even", 8) 
    println(multiMap) // Map(odd -> Set(5, 3, 1), even -> Set(6, 8, 4, 2)) 
} 

ध्यान दें कि यह GroupBy का परिणाम (...) क्योंकि बीज नक्शा ख के लिए आवश्यक है पर नहीं किया जा सकता ई mutable और groupby (...) एक अपरिवर्तनीय मानचित्र देता है।

+0

कॉलिंग समूह द्वारा() और एक परिवर्तनीय संग्रह एक mutable वापस करता है। मैप। –

+0

क्या आप समूह को प्रदर्शित कर सकते हैं एक म्यूटेबल मानचित्र लौट रहे हैं? मुझे यहां एक कंपाइलर त्रुटि मिलती है जैसे कि यहां दिखाया गया है (http://gist.github.com/245062)। –

+0

मुझे लगता है कि यह mutable सेट का एक अपरिवर्तनीय मानचित्र देता है? भले ही, मुझे एक नक्शा नहीं चाहिए, मुझे एक मल्टीमैप चाहिए। –

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