Сортировать перечисляемый в порядке убывания - PullRequest
7 голосов
/ 26 января 2010

Как лучше всего отсортировать Enumerable в порядке убывания?

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

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

Ответы [ 2 ]

5 голосов
/ 27 января 2010

Производительность Array.reverse не является очень плохой. Использование @array.sort.reverse требует дополнительных затрат на дублирование массива плюс обратное (n / 2-элементные переключатели). Так что да, я думаю, что это должно быть приемлемо, если вы думаете, что это читается яснее.

См. источник для деталей. Кроме того, я думаю, что использование @array.sort.reverse обеспечивает «немного» лучшую читаемость (но это не очень сложно читать).

3 голосов
/ 27 января 2010

Я не уверен, работает ли это лучше, чем Уэйн Конрад , который сам себя описал "очевидный кусок мусора", но вы могли бы определить 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)
...