वेक्टर या मानचित्र के विरुद्ध मानों को सॉर्ट करने के लिए हमारे पास 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 उत्तर
यह आपको ऐसा करने की अनुमति देता है
(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})
#(.indexOf one-values my-val)
को पास करना चाहते हैं my-val
एक कुंजी के रूप में, और संबंधित मान के रूप में अनुक्रमणिका मान, ताकि इसे रेखीय स्कैन की तुलना में तेज़ी से निर्धारित किया जा सके।
(def ^:const one-values [10 5 1 2 4 3]
। तो वृद्धिशील तरीके से ऑटो-सॉर्टिंग के बजाय, इसे वेक्टरone-values
में उन मानों की अनुक्रमणिका के आधार पर करना चाहिए।({:one 1, :two 2, :three 3}, {:one 4, :two 4, :three 3}, {:one 3 :two 2 :three 1})
उस क्रम पर ध्यान दें जिसमें1
,4
, और3
वेक्टर में दिखाई देते हैंone-values
.^:const
का उपयोग केवल इसलिए न करें क्योंकि आप मान के बदलने की अपेक्षा नहीं करते हैं। क्लोजर में सभी मानों की यही अपेक्षा है, इसलिए इसके बजाय^:const
का अर्थ कुछ और है। संकलक के लिए इसका मूल रूप से अर्थ है "मैं आपको हर बार इस मूल्य को इनलाइन करने के लिए प्रोत्साहित करता हूं", जो कि ऐसा कुछ है जिसे आप शायद ही कभी करना चाहते हैं।