2010-01-26 24 views
7

Enumerable'u azalan sırada sıralamanın en iyi yolu nedir? BenAzalan sırayla azalan bir sıralama

@array.sort.reverse veya @array.sort_by{|song| song.title }.reverse yapıyorum

ben @array.sort{|a, b| b.title <=> a.title} gibi bir şey herhalde, ama bu okumak zor ve ayrıntılı bulabilirsiniz.

+3

Bence 'array.sort.reverse' iyi. Bu basit ve açık ve çok pahalı olmamalı. – Peter

+0

Niçin #reverse kullanmazdınız? – mikezter

+0

Sıralama “O (n log n)” olduğu ve tersi sadece “O (n)” olduğu için, Peter'ın çözümü iyidir. –

cevap

5

Array.reverse'un performansı, 'un çok'unun performansı değildir. @array.sort.reverse kullanarak size ne pahasına ekstra bir dizi çoğaltma artı ters (n/2 eleman anahtarları). Evet, bence daha açık olduğunu düşündüğünüzde bunun kabul edilebilir olduğunu düşünüyorum.

Ayrıntılar için, bkz source. Ve ayrıca, @array.sort.reverse'un 'biraz daha iyi okunabilirlik' sağladığını düşünüyorum (ancak herhangi bir şekilde okunması zor değil).

+1

sort.reverse sıralamadan çok daha yavaş değildir ve her şeyden daha hızlıdır. Ben array.sort, array.sort.reverse ve array.reverse_sort (o zamandan beri 1.000.000 rasgele float üzerinde "bariz bir parça" olarak silindi) benim maymun yama çözüm, benchmarked ve 2.4, 2.5 ve Sırasıyla 24.8 saniye. –

3

Ben 'önemsiz bariz parçası' Bu Wayne Conrad 'ın kendini tarif daha iyi çalışıp çalışmadığından emin değilim ama şöyle

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

Sonra diyoruz Enumerable#sort_by_descending

olarak tanımlayabiliriz:

@songs.sort_by_descending(&:title) 
İlgili konular