Простейший код для сортировки массивов в ruby? - PullRequest
6 голосов
/ 16 сентября 2009

Я обычно делаю что-то вроде

array.sort{|a,b| a.something <=> b.something}

Как мне это высушить?

Ответы [ 4 ]

20 голосов
/ 16 сентября 2009

использовать sort_by

array.sort_by{|e| e.something}

или

sort_lambda = lambda{|e| e.something}
array.sort_by(&sort_lambda)

С последним вы можете использовать sort_lambda в других выражениях sort_by

5 голосов
/ 16 сентября 2009

+ 1 к обоим предложениям Eimantas, но я часто сталкиваюсь с этим в тех случаях, когда у меня есть собственный класс, который сортирует всегда таким образом, как альбомы, которые должны сортировать без учета регистра, игнорируя пунктуация и / / /. Для этого более эффективно рассчитать значение сортировки один раз, а затем переопределить <=> соответственно. E.g.:

class Album
 def sort_value
    @sv ||= @name.downcase.sub(/^\W*(the|an|a) /,"")
  end

  def <=>(other)
    sort_value <=> (other.sort_value rescue other)
  end
end
5 голосов
/ 16 сентября 2009

В Rails, точнее с ActiveSupport или в Ruby 1.9 (возможно, 1.8.7, не уверен), вы можете использовать новую горячую комбинацию:

array.sort_by(&:something)

Обратите внимание, что sort_by имеет, возможно, дорогие (и, возможно, выгодные: это зависит от сложности ключа сортировки) побочные эффекты: он генерирует и сохраняет временную пару ключ-значение для каждого элемента, чтобы он мог сортировать по вашему новому ключу. Подробнее об этом см. Обсуждение в документации .

0 голосов
/ 17 сентября 2009

Рассматривали ли вы включение Comparable в класс для a и b и просто вызов сортировки?

...