जवाबों:
मैं इसके बजाय Sort_by का उपयोग करने की सलाह देता हूं:
objects.sort_by {|obj| obj.attribute}
खासकर अगर विशेषता की गणना की जा सकती है।
या अधिक संक्षिप्त दृष्टिकोण:
objects.sort_by(&:attribute)
objects.sort_by { |obj| obj.attribute.downcase }
sort!
(जैसे गति, आदि)?
हां, इसका उपयोग Array#sort!
करना आसान है।
myarray.sort! { |a, b| a.attribute <=> b.attribute }
<=>
? किस तरह की त्रुटियां हो रही हैं? आदि, विज्ञापन, nauseum दूसरे शब्दों में, हमें "लेकिन मेरे लिए कोई भाग्य नहीं" से अधिक विस्तार की आवश्यकता है।
sort
यदि आप मूल को संरक्षित करना चाहते हैं और परिणाम को किसी भिन्न ऑब्जेक्ट पर असाइन करना चाहते हैं, तो उपयोग करें ; अन्यथा,, यथा-स्थान भिन्न रूप का उपयोग sort!
। वास्तव में, मूल वस्तु की नकल करने के बाद, आंतरिक रूप से sort
कॉल करता है sort!
।
sort!
बस ठीक काम करेगा, और हमेशा (!) जैसा आपने लिखा है वैसा ही करें।
यदि आपको दो विशेषताओं के आधार पर छंटनी की आवश्यकता होती है, जहां पहले एक और अधिक महत्वपूर्ण है तो दूसरा (मतलब दूसरी दलील को ध्यान में रखते हुए यदि पहले तर्क समान हैं), तो आप ऐसा कर सकते हैं
myarray.sort{ |a,b| (a.attr1 == b.attr1) ? a.attr2 <=> b.attr2 : a.attr1 <=> b.attr1 }
या सरणी के मामले में
myarray.sort{ |a,b| (a[0] == b[0]) ? a[1] <=> b[1] : a[0] <=> b[0] }
आप <=> विधि को ओवरराइड करके किसी भी वर्ग को क्रमबद्ध कर सकते हैं:
class Person
attr_accessor :first_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
def <=>(other)
@last_name + @first_name <=> other.last_name + other.first_name
end
end
अब last_name पर व्यक्तिगत वस्तुओं की एक सरणी छंटनी होगी।
ar = [Person.new("Eric", "Cunningham"), Person.new("Homer", "Allen")]
puts ar # => [ "Eric Cunningham", "Homer Allen"] (Person objects!)
ar.sort!
puts ar # => [ "Homer Allen", "Eric Cunningham" ]
जैसा कि ऊपर पोस्ट किया गया है, एरियर # सॉर्ट अच्छा काम करता है:
myarray.sort! { |a, b| a.attribute <=> b.attribute }
लेकिन, आपको यह सुनिश्चित करने की आवश्यकता है कि <=>
ऑपरेटर उस विशेषता के लिए कार्यान्वित किया गया है। यदि यह रूबी मूल डेटा प्रकार है, तो यह कोई समस्या नहीं है। अन्यथा, आप अपने स्वयं के कार्यान्वयन को लिखते हैं जो -1 लौटाता है अगर <b, 0 यदि वे समान हैं, और 1 यदि a> b है।
@model_name.sort! { |a,b| a.attribute <=> b.attribute }
sort
जब आप ऐसी वस्तुओं को छाँट रहे हों, जिनका उपयोग सीधे नहीं किया जा सकता है। यदि आपको उपयोग की विशेषताओं को प्राप्त करना है या उपयोग की तुलना करने के लिए मूल्य प्राप्त करने के लिए एक संगणना करना है sort_by
। यह ज्यादा तेज होगा।
objects.sort_by(&:attribute)