2010-01-26 15 views
7

अवरोही क्रम में Enumerable सॉर्ट करने का सबसे अच्छा तरीका क्या है?अवरोही क्रम में एक गणना करने योग्य क्रमबद्ध करें

मैं @array.sort.reverse या @array.sort_by{|song| song.title }.reverse

कर रहा हूँ मुझे लगता है मैं @array.sort{|a, b| b.title <=> a.title} की तरह कुछ कर सकता है लगता है, लेकिन मैं पढ़ने के लिए इस कठिन और वर्बोज़ पाते हैं।

+3

मुझे लगता है कि 'array.sort.reverse' अच्छा है। यह सरल और स्पष्ट है, और बहुत महंगा नहीं होना चाहिए। – Peter

+0

आप # रिवर्स का उपयोग क्यों नहीं करेंगे? – mikezter

+0

चूंकि प्रकार 'ओ (एन लॉग एन) 'है और रिवर्स सिर्फ' ओ (एन) 'है, पीटर का समाधान अच्छा है। –

उत्तर

5

Array.reverse का प्रदर्शन बहुत खराब नहीं है। @array.sort.reverse का उपयोग कर आपको कितना खर्च होता है एक अतिरिक्त सरणी डुप्लिकेशन और रिवर्स (एन/2 तत्व स्विच) है। तो हाँ, मुझे लगता है कि अगर आपको लगता है कि यह स्पष्ट पढ़ा गया है तो स्वीकार्य होना चाहिए।

विवरण के लिए source देखें। और, मुझे लगता है कि @array.sort.reverse का उपयोग करना 'थोड़ा' बेहतर पठनीयता प्रदान करता है (लेकिन किसी भी तरह से पढ़ने में बहुत मुश्किल नहीं है)।

+1

sort.reverse सॉर्ट की तुलना में बहुत धीमी नहीं है, और यह किसी भी फैंसी से तेज़ तरीका है। मैंने array.sort, array.sort.reverse, और array.reverse_sort (मेरे बंदर-पैच समाधान, जिसे मैंने "जंक का एक स्पष्ट टुकड़ा" के रूप में हटा दिया है) को 1,000,000 यादृच्छिक फ्लोट पर हटा दिया है और 2.4, 2.5 और क्रमशः 24.8 सेकंड। –

3

मुझे यकीन है कि क्या यह किसी भी Wayne Conrad के स्व-वर्णित की तुलना में बेहतर काम करता है नहीं कर रहा हूँ "जंक के स्पष्ट टुकड़ा," लेकिन आप निर्धारित कर सकते हैं Enumerable#sort_by_descending

रूप
Enumerable.class_eval do 
    def sort_by_descending(&block) 
    sort { |a, b| block.bind(b).call <=> block.bind(a).call } 
    end 
end 

तो यह फोन इस प्रकार है:

@songs.sort_by_descending(&:title)