वेक्टर या मानचित्र के विरुद्ध मानों को सॉर्ट करने के लिए हमारे पास sort-by क्लोजर में है।

उदाहरण के लिए, यदि मेरे पास एक वेक्टर है जिसे मैं इसके विरुद्ध सॉर्ट करना चाहता हूं:

(def ^:const sort-numbers ["one" "two" "three" "four" "five"])

और मेरे पास अव्यवस्थित मूल्यों वाला यह यादृच्छिक वेक्टर है, जैसे कुछ:

(def numbers ["two" "three" "one" "four"])

अब, उन्हें इसके द्वारा क्रमबद्ध किया जा सकता है:

(sort-by #(.indexOf sort-numbers %) numbers)

दोबारा, अब मेरे पास नक्शे का यह वेक्टर है:

(def numbers-map [{:one 1 :two 2 :three 3} 
                  {:one 4 :two 4 :three 3}
                  {:one 3 :two 2 :three 1}])

अगर मैं वेक्टर में सभी मानचित्रों के विरुद्ध numbers-map कुंजी के मान से :one को सॉर्ट करना चाहता हूं,

(sort-by :one numbers-map)

करेगा, और यह मुझे निम्नलिखित परिणाम देगा:

({:one 1, :two 2, :three 3} {:one 3, :two 2, :three 1} {:one 4, :two 4, :three 3})

अब, मुझे जो चाहिए वह है इनमें से एक संयोजन। यही है, मुझे numbers-map को कुंजी :one के मान से सॉर्ट करने की आवश्यकता है, लेकिन मैं नहीं चाहता कि उन्हें ऑटो-सॉर्ट किया जाए, बल्कि उन्हें सभी संभावित मानों के निर्दिष्ट वेक्टर के विरुद्ध सॉर्ट करें :one का जो मेरे पास पहले से कहीं है।

यह कैसे हासिल किया जा सकता है?

1
Dipti 1 फरवरी 2021, 15:15
क्या आप हमें सभी संभावित मानों का निर्दिष्ट वेक्टर दिखा सकते हैं:एक जो आपके पास कहीं है? किसी दिए गए इनपुट के लिए अपेक्षित आउटपुट के साथ?
 – 
jas
1 फरवरी 2021, 15:38
आइए उदाहरण के लिए केवल एक मनमाना वेक्टर का उपयोग करें: (def ^:const one-values [10 5 1 2 4 3]। तो वृद्धिशील तरीके से ऑटो-सॉर्टिंग के बजाय, इसे वेक्टर one-values में उन मानों की अनुक्रमणिका के आधार पर करना चाहिए।
 – 
Dipti
1 फरवरी 2021, 15:39
और वेक्टर के खिलाफ इसे छांटने से अपेक्षित आउटपुट होगा: ({:one 1, :two 2, :three 3}, {:one 4, :two 4, :three 3}, {:one 3 :two 2 :three 1}) उस क्रम पर ध्यान दें जिसमें 1, 4, और 3 वेक्टर में दिखाई देते हैं one-values .
 – 
Dipti
1 फरवरी 2021, 15:47
1
^:const का उपयोग केवल इसलिए न करें क्योंकि आप मान के बदलने की अपेक्षा नहीं करते हैं। क्लोजर में सभी मानों की यही अपेक्षा है, इसलिए इसके बजाय ^:const का अर्थ कुछ और है। संकलक के लिए इसका मूल रूप से अर्थ है "मैं आपको हर बार इस मूल्य को इनलाइन करने के लिए प्रोत्साहित करता हूं", जो कि ऐसा कुछ है जिसे आप शायद ही कभी करना चाहते हैं।
 – 
amalloy
1 फरवरी 2021, 22:26

1 उत्तर

सबसे बढ़िया उत्तर

यह आपको ऐसा करने की अनुमति देता है

(def numbers-maps [{:one 1 :two 2 :three 3} 
                   {:one 4 :two 4 :three 3}
                   {:one 3 :two 2 :three 1}])

(def sort-numbers [4 3 2 1])

(sort-by #(.indexOf sort-numbers (:one %))
         numbers-maps)

({:one 4, :two 4, :three 3}
 {:one 3, :two 2, :three 1}
 {:one 1, :two 2, :three 3})

यहाँ एक और उदाहरण है:

(def numbers-maps [{:one 6, :two 9, :three 9}
                   {:one 9, :two 9, :three 8}
                   {:one 7, :two 6, :three 2}
                   {:one 4, :two 4, :three 5}
                   {:one 9, :two 1, :three 5}
                   {:one 1, :two 8, :three 8}
                   {:one 8, :two 3, :three 9}
                   {:one 8, :two 4, :three 5}
                   {:one 4, :two 8, :three 1}
                   {:one 5, :two 1, :three 1}])

(def one-values [10 5 1 2 4 3])

(sort-by #(.indexOf one-values (:one %))
         numbers-maps)

({:one 6, :two 9, :three 9}
 {:one 9, :two 9, :three 8}
 {:one 7, :two 6, :three 2}
 {:one 9, :two 1, :three 5}
 {:one 8, :two 3, :three 9}
 {:one 8, :two 4, :three 5}
 {:one 5, :two 1, :three 1}
 {:one 1, :two 8, :three 8}
 {:one 4, :two 4, :three 5}
 {:one 4, :two 8, :three 1})
2
MicSokoli 1 फरवरी 2021, 16:32
धन्यवाद। मैंने सोचा कि ऐसा कुछ करना चाहिए लेकिन किसी तरह इस रूप को याद किया। :डी
 – 
Dipti
1 फरवरी 2021, 16:29
1
दक्षता टिप - indexOf वेक्टर के माध्यम से एक रैखिक स्कैन करता है, इसलिए यह धीमा हो सकता है यदि वेक्टर बड़ा है और आप अक्सर उदाहरण के लिए 1000-वें तत्व की अनुक्रमणिका देख रहे हैं। कुछ मामलों में क्लोजर मानचित्र को मानों से उनके सापेक्ष अनुक्रमणिका में पूर्व-गणना करना तेज़ हो सकता है, यानी यह प्रत्येक संभावित मान के लिए देता है जिसे आप #(.indexOf one-values my-val) को पास करना चाहते हैं my-val एक कुंजी के रूप में, और संबंधित मान के रूप में अनुक्रमणिका मान, ताकि इसे रेखीय स्कैन की तुलना में तेज़ी से निर्धारित किया जा सके।
 – 
andy_fingerhut
1 फरवरी 2021, 17:49