मैं हैश में एक मूल्य द्वारा हैश की एक सरणी को कैसे सॉर्ट करता हूं?


120

यह रूबी कोड व्यवहार नहीं कर रहा है जैसा कि मैं उम्मीद करूंगा:

# create an array of hashes
sort_me = []
sort_me.push({"value"=>1, "name"=>"a"})
sort_me.push({"value"=>3, "name"=>"c"})
sort_me.push({"value"=>2, "name"=>"b"})

# sort
sort_me.sort_by { |k| k["value"]}

# same order as above!
puts sort_me

मैं कुंजी "मूल्य" द्वारा हैश की सरणी को सॉर्ट करना चाह रहा हूं, लेकिन वे बिना प्रिंट किए हुए हैं।

जवाबों:


215

रूबी sortजगह में सॉर्ट नहीं करता है। (क्या आपके पास अजगर पृष्ठभूमि है, शायद?)

रूबी में sort!इन-प्लेस सॉर्टिंग के लिए है, लेकिन sort_byरूबी 1.8 में इन-प्लेस वेरिएंट नहीं है । व्यवहार में, आप कर सकते हैं:

sorted = sort_me.sort_by { |k| k["value"] }
puts sorted

रूबी 1.9+ के अनुसार, .sort_by!इन-प्लेस सॉर्टिंग के लिए उपलब्ध है:

sort_me.sort_by! { |k| k["value"]}

28
दरअसल, Array#sort_by!रूबी 1.9.2 में नया है। मेरे backportsमणि को भी आवश्यकता
— पड़ने

नमस्ते, वहाँ एक तरह से अवरोही क्रम में भी है? मुझे लगता है मैं जाना चाहता हूँ 3,2,1...
— tekknolagi

2
आप ऐसा नहीं कर सकते हैं sort_by, लेकिन ऑपरेशंस का उपयोग sortया या sort!बस फ्लिप कर सकते हैं: a.sort! {|x,y| y <=> x }( ruby-doc.org/core-1.9.3/Array.html#method-i-sort )
— स्टीफन कोचन

1
या:puts sorted = sort_me.sort_by{ |k,v| v }
— ज़ाज़

9
@tekknolagi: बस संलग्न करें .reverse।
— ज़ाज़

21

@Shteef के अनुसार, लेकिन sort!सुझाए गए प्रकार के साथ लागू किया गया :

sort_me.sort! { |x, y| x["value"] <=> y["value"] }

7

हालाँकि रूबी के पास sort_byइन-प्लेस वैरिएंट नहीं है, आप यह कर सकते हैं:

sort_me = sort_me.sort_by { |k| k["value"] }

Array.sort_by! 1.9.2 में जोड़ा गया था


1
इस "Array.sort_by! को 1.9.2 में जोड़ा गया" उत्तर ने मेरे लिए काम किया
— वेब मकड़ी 26

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.