2010-01-26 1 views
7

Каков наилучший способ сортировки Enumerable в порядке убывания?Сортировка перечислимого в убывающем порядке

Я делал @array.sort.reverse или @array.sort_by{|song| song.title }.reverse

Я предполагаю, что я мог бы сделать что-то вроде @array.sort{|a, b| b.title <=> a.title}, но я считаю, что это трудно читать и многословным.

+3

Я думаю 'массив.sort.reverse' хороший. Это просто и понятно, и не должно быть очень дорого. – Peter

+0

Почему вы не используете #reverse? – mikezter

+0

Поскольку сортировка 'O (n log n)' и reverse - это просто 'O (n)', решение Питера - это хорошо. –

ответ

5

Производительность Array.reverse не очень плохой. Что стоит вам при использовании @array.sort.reverse - это дополнительное дублирование массива плюс обратное (n/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 «s самоописанный„очевидно кусок хлама“, но вы можете определить, как 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) 

 Смежные вопросы

  • Нет связанных вопросов^_^