2010-03-29 18 views
127

मेरे पास एक काउंटर हैश है कि मैं गिनती से सॉर्ट करने की कोशिश कर रहा हूं। जिस समस्या में मैं चल रहा हूं वह यह है कि डिफ़ॉल्ट Hash.sort फ़ंक्शन संख्या आकार के बजाए तारों की तरह संख्याओं को टाइप करता है।रूबी हैश को संख्या मूल्य से कैसे क्रमबद्ध करें?

यानी देखते हुए हैश:

metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 } 

इस कोड चल रहा है:

metrics.sort {|a1,a2| a2[1]<=>a1[1]} 

एक क्रमबद्ध सरणी वापस आ जाएगी:,

[ 'siteb.com', 9, 'sitea.com', 745, 'sitec.com', 10] 

हालांकि 745 9 की तुलना में एक बड़ी संख्या है 9 सूची में पहले दिखाई देगा। यह दिखाने की कोशिश करते समय कि शीर्ष गिनती किसके पास है, यह मेरी जिंदगी को मुश्किल बना रहा है। :)

संख्या मूल्य के आधार पर हैश (या सरणी भी) को सॉर्ट करने के तरीके पर कोई विचार?

मैं किसी भी मदद की सराहना करता हूं।

+0

आप क्या रूबी संस्करण का उपयोग करते हैं? आपका सॉर्ट परिणाम बहुत अजीब है – fl00r

उत्तर

225

कोई विचार कैसे आप अपने परिणामों को मिल गया है, क्योंकि यह नहीं प्रकार स्ट्रिंग मान से ... आप a1 और a2 अपने उदाहरण में किसी भी मामले में रिवर्स चाहिए

सबसे अच्छा तरीका है (म्लादेन के अनुसार):

metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 } 
metrics.sort_by {|_key, value| value} 
    # ==> [["siteb.com", 9], ["sitec.com", 10], ["sitea.com", 745]] 

आप एक परिणाम के रूप में एक हैश की जरूरत है, तो आप to_h (रूबी 2.0+ में)

metrics.sort_by {|_key, value| value}.to_h 
    # ==> {"siteb.com" => 9, "sitec.com" => 10, "sitea.com", 745} 
+79

या बस 'sort_by {| k, v | v} ' –

+1

वास्तव में ... उत्तर udpated :-) –

+0

मेरा नंबर एक स्ट्रिंग के रूप में लौट रहा था, जिसने इसे ठीक किया .. मेरे पास उस क्रम में a2 और a1 था क्योंकि मैं परिणाम निर्णय लेने के लिए चाहता था .. हालांकि आपकी प्रतिक्रिया के लिए धन्यवाद । –

8

उपयोग कर सकते हैं कि व्यवहार नहीं है मैं देख रहा हूं:

irb(main):001:0> metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 
10 } 
=> {"siteb.com"=>9, "sitec.com"=>10, "sitea.com"=>745} 
irb(main):002:0> metrics.sort {|a1,a2| a2[1]<=>a1[1]} 
=> [["sitea.com", 745], ["sitec.com", 10], ["siteb.com", 9]] 

क्या यह संभव है कि लाइन के साथ कहीं आपकी संख्या तारों में परिवर्तित हो रही हो? क्या कोई और कोड है जिसे आप पोस्ट नहीं कर रहे हैं?

+0

आह आपका अधिकार ऐसा लगता है कि मेरा कोड एक स्ट्रिंग के रूप में इसे वापस कर रहा था। अजीब डेटा प्रकार। :) कभी-कभी मैं समस्या के बहुत करीब हूं। धन्यवाद। –

+1

यूप। कभी-कभी मैं किसी को रूबी को "untyped" के रूप में संदर्भित करता हूं। ओह, नहीं, यह निश्चित रूप से टाइप किया गया है। यह सिर्फ स्थिर रूप से टाइप नहीं है। :) –

12

पहले से ही उत्तर दिया गया है लेकिन अभी भी। अपना कोड इस पर बदलें:

metrics.sort {|a1,a2| a2[1].to_i <=> a1[1].to_i } 

रास्ते में तारों में कनवर्ट किया गया या नहीं, यह काम करेगा।

70

के बाद से मूल्य अंतिम प्रविष्टि है, तो आप कर सकते हैं:

metrics.sort_by(&:last) 
+0

महान सादगी के साथ बहुत बढ़िया जवाब! –

+4

यह कमाल है! 'और: आखिरी' की पूर्व-परिभाषा के लिए कोई रेफरेंस? –

+0

'sort_by (&: last)' 'sort_by {| x | के लिए प्रभावी रूप से लघुरूप है। x.last} 'https://stackoverflow.com/questions/1217088/what-does-mapname-mean-in-ruby –

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