2009-06-21 6 views
10

में कुल सूची मूल्य मैं स्कैला सीख रहा हूं और भाषा के कुछ कार्यात्मक पहलुओं की खोज कर रहा हूं।स्कैला

ऑब्जेक्ट्स की एक सूची से शुरू करना जिसमें दो पैरामीटर नोटियन और मुद्रा शामिल हैं, मैं प्रति मुद्रा कुल धारणा को कैसे जोड़ सकता हूं?

trait Groupable[V] extends Iterable[V] { 
    def groupBy(f: V => K): MultiMap[K, V] = { 
    val m = new mutable.HashMap[K, Set[V]] with mutable.MultiMap[K, V] 
    foreach { v => m add (f(v), v) } //add is defined in MultiMap 
    m 
    } 
} 
implicit def it2groupable(it: Iterable[V]): Groupable[V] = new Groupable[V] { 
    def elements = it.elements 
} 

तो Groupable है:

//sample data 
val t1 = new Trade("T150310", 10000000, "GBP"); 
val t2 = new Trade("T150311", 10000000, "JPY"); 
val t3 = new Trade("T150312", 10000000, "USD"); 
val t4 = new Trade("T150313", 100, "JPY"); 
val t5 = new Trade("T150314", 1000, "GBP"); 
val t6 = new Trade("T150315", 10000, "USD"); 

val trades = List(t1, t2, t3, t4, t5, t6); 

उत्तर

4

मैं जो उनके currency करके अपने ट्रेडों समूह के लिए आप की अनुमति होगी (एक Iterable से एक अंतर्निहित रूपांतरण के साथ वास्तव में एक Groupabletrait) एक सरल समूह द्वारा लिखा आपरेशन Iterable में प्रत्येक आइटम से कुंजी निकालने का एक तरीका प्रदान करना और फिर ऐसी सभी वस्तुओं को समूहीकृत करना जिनमें एक ही कुंजी हो। तो, आपके मामले में: - करने के लिए

//mm is a MultiMap[Currency, Trade] 
val mm = trades groupBy { _.currency } 

अब आप एक foldLeft (अच्छी तरह से foldLeft ऑपरेटर के रूप में यह संग्रह से अधिक अत्यंत संक्षिप्त एकत्रित सक्षम बनाता है समझने लायक या /:) एक काफी सरल mapElements (mm एक Map है) और क्या कर सकते हैं योग प्राप्त करें:

val sums: Map[Currency, Int] = mm mapElements { ts => 
    (0 /: ts) { (sum,t) => sum + t.notional } 
} 

क्षमा करें अगर मैंने उस अंतिम पंक्ति में कुछ गलतियां की हैं। tsmm के मान हैं, जो (बेशक) Iterable[Trade] हैं।

+0

क्षमा करें, किसी कारण से मैंने "व्यापार" पढ़ा लेकिन मेरे मूल उत्तर में "टुपल" सुना। मैंने इसे अभी संपादित कर लिया है! –

16

यदि आप ट्रंक का उपयोग करते हैं तो मशीनरी पहले से मौजूद है। GroupBy को ट्रैवर्सबल पर परिभाषित किया गया है और योग सीधे सूची में लागू किया जा सकता है, आपको एक गुना लिखना नहीं है।

scala> trades groupBy (_.currency) map { case (k,v) => k -> (v map (_.amount) sum) } 
res1: Iterable[(String, Int)] = List((GBP,10001000), (JPY,10000100), (USD,10010000)) 
+0

क्या यह 2.8 में आ रहा है? –

+0

और क्या आप समझा सकते हैं कि योग फ़ंक्शन कहां से आ रहा है? –

+0

हां, अब ट्रंक क्या है 2.8 होगा। योग विधि को न्यूमेरिक ट्रावर्सेबलऑप्स पर परिभाषित किया गया है - जो कि एक वर्ग नहीं है जिसके बारे में आपको कुछ भी जानने की आवश्यकता है - लेकिन यह मूल रूप से एक संख्यात्मक [टी] की उपस्थिति के आधार पर अंतर्निहित तरीके से ट्रैवर्सबल को विधियों को जोड़ता है, जो स्वयं "जोड़" को परिभाषित करता है सामान्य रूप से परिभाषित किया जा सकता है। – extempore