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


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.