2009-10-06 6 views
8

मैं दस्तावेज को बिल्कुल समझ नहीं सकता।क्लोजर में सॉर्ट किए गए मानचित्र का उपयोग कैसे करते हैं?

मुझे एक क्रमबद्ध नक्शा "xxx" चाहिए, जो मूल्य के अनुसार मानचित्र को टाइप करता है। मैं उसको कैसे करू?

धन्यवाद।

उत्तर

4

आप कुंजी-मूल्य-जोड़े के बाद एक तुलना निर्दिष्ट करके क्रमबद्ध-मानचित्र-द्वारा उपयोग करते हैं। तुलनित्र एक ऐसा कार्य है जो दो कुंजी लेता है और 1, 0 या 1 देता है, इस पर निर्भर करता है कि पहली कुंजी दूसरी कुंजी से बराबर या उससे अधिक है या नहीं।

उदाहरण:

user=> (sorted-map-by (fn [k1 k2] (compare (mod k1 10) (mod k2 10))) 10 1 23 4 2 5) 
{10 1, 2 5, 23 4} 

comparisson समारोह केवल तर्कों के रूप प्रयास लगता है के बाद से, आप मूल्यों से सॉर्ट करने के लिए इस का उपयोग नहीं कर सकते।

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

+1

डॉक पेज में मुझे लगता है कि आप बातचीत अर्थ पढ़ सकते हैं "यदि आप, मूल्यों के अनुसार नक्शा सॉर्ट करने के लिए चाहते हैं ..." http://clojuredocs.org/clojure_core/clojure.core/sorted -map-by – tangrammer

16

एक और तरीका तुलनात्मक फ़ंक्शन के भीतर मूल मानचित्र से मूल्यों की तुलना करना है।

(def my-map {:chad 3 :bob 5 :sammy 4}) 

;; sort by keys ascending 
(into (sorted-map) my-map) 
=> {:bob 5, :chad 3, :sammy 4} 

;; sort by values ascending 
(into (sorted-map-by (fn [key1 key2] (compare (key1 my-map) (key2 my-map)))) my-map) 
=> {:chad 3, :sammy 4, :bob 5} 

;; sort by values descending 
(into (sorted-map-by (fn [key1 key2] (compare (key2 my-map) (key1 my-map)))) my-map) 
=> {:bob 5, :sammy 4, :chad 3} 
+2

सावधान रहें, आपके समाधान में एक बग है, इसे जांचें: (मेरा नक्शा डीफ़ करें {: चाड 3: बॉब 5: एलिस 3: सैमी 4}) आपके समाधान के साथ: एलिस 3 होगा परिणामस्वरूप मानचित्र से काट लें। –

+0

@AlfredoDiNapoli मैंने एक ही समस्या देखी। मैं अज्ञात फ़ंक्शन में तुलना करने के बजाय <= का उपयोग करके इसे ठीक करने में सक्षम था। – Rafael

+0

'सॉर्टेड-मैप-बाय' के कार्यान्वयन के लिए मेरे कोड को बाध्यकारी 'तुलना' के बजाय '<=' का उपयोग करने के लिए @Rafael विचार नहीं है? क्लोजर डॉक्स 'सॉर्ट-मैप-बाय' के उपयोग के मामले को संदर्भित करता है और इस तरह के समाधान का प्रस्ताव करता है: '(में (क्रमबद्ध-मानचित्र-द्वारा (fn [key1 key2] (तुलना करें [(key1 my-map2) key1] [ (key2 my-map2) key2]))) my-map2) 'इसके बजाए – mjaskowski

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