2014-12-11 16 views
5

स्कैला संग्रह पुस्तकालय में mapValues और filterKeys है। कारण यह mapKeys नहीं है की संभावना प्रदर्शन पहलू (HashMap कार्यान्वयन के संबंध में), के रूप में यहाँ हास्केल के लिए विचार-विमर्श किया है: Why there's not mapKeys in Data.Hashmap?क्यों स्कैला में कोई नक्शा नहीं है?

हालांकि।

प्रदर्शन निहितार्थ अलग रूप में, मैं अपने आप को mapKeys कम से कम के रूप में ज्यादा के रूप में की आवश्यकता होगी, mapValues, बस डेटा मालिश करने के लिए (अर्थात मैं डेटा अमूर्त के लिए एक मानचित्र का उपयोग कर रहा है, इसकी लाने गति के लिए नहीं) लगता है।

क्या मैं गलत हूं, और इसके लिए आप किस डेटा मॉडल का उपयोग करेंगे? Tuples?

+1

यदि कुंजी मैपिंग टकराव पैदा करती है, तो आप नए मानचित्र में कौन से मूल्यों को ढूंढने की उम्मीद करते हैं? पहला, आखिरी, या एक ही कुंजी के साथ सभी मानों का संग्रह? –

+0

अच्छा बिंदु। मेरे मामले में मैं कोई टकराव की गारंटी नहीं दूंगा, लेकिन यह दिखाता है कि संग्रह पुस्तकालयों को डिजाइन करने में कितनी जरूरतों पर विचार किया जाना चाहिए। – akauppi

+0

@LeifWickland, जैसा कि आप स्कैला में 'सेट' पर मानचित्र करते हैं, वही होता है: यह छोटा हो सकता है। –

उत्तर

10

कोई विचार क्यों यह मानक पुस्तकालय में नहीं है, लेकिन आप आसानी से निहित वर्ग के साथ अपने पुस्तकालय दलाल कर सकते हैं

implicit class MapFunctions[A, B](val map: Map[A, B]) extends AnyVal { 
    def mapKeys[A1](f: A => A1): Map[A1, B] = map.map({ case (a, b) => (f(a), b) }) 
    } 

    val m = Map(1 -> "aaa", 2 -> "bbb") 

    println(m.mapKeys(_ + 1)) 
2
scalaz

आप उपयोग कर सकते हैं:

import scalaz.Scalaz._ 

val m = Map(1 -> "aaa", 2 -> "bbb") 
m.mapKeys(_ + 1) 

टकराव के मामले में परिणाम हो सकता है मूल मानचित्र से छोटा है।

+0

स्कालाज़ सी ++ के लिए बूस्ट की तरह है, और मैं इसे उसी कारण से छू नहीं रहा हूं। – akauppi

+0

सहमत हैं। और मुझे लगता है कि इसे स्कैला कंपाइलर देवताओं के लिए विचारों के पूल के रूप में भी काम करना चाहिए। मुझे नहीं पता कि वे उन्हें क्यों नहीं मानते हैं। इस विधि mapKeys एक स्पष्ट उदाहरण है प्रत्येक डेवलपर संग्रह पुस्तकालय में अपेक्षा करेगा। – mirelon

+0

@akauppi बूस्ट और स्कालज़ दोनों के साथ क्या गलत है? –

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