Массив сортировки Ruby при условии в обратном порядке [дубликат]

Возможные Дубликаты:
сортировка массива в порядке убывания в Ruby

Я хочу, чтобы отсортировать массив элементов на основе некоторого условия, только в обратном порядке. Так что, в основном, что бы он ни сделал, а затем поменял местами.

например, у меня есть массив строк, и я хочу отсортировать его, уменьшив длину строки

a = ["test", "test2", "s"]
a.sort_by!{|str| str.length}.reverse!

пока это делает работу...есть ли способ указать состояние такое, что алгоритм сортировки будет делать это в обратном направлении?

2 ответов


длина-это число, поэтому вы можете просто отрицать его, чтобы изменить порядок:

a.sort_by! { |s| -s.length }

если вы сортируете что-то, что нелегко отрицать, вы можете использовать sort! и вручную отменить сравнение. Например, обычно вы делаете это:

# shortest to longest
a.sort! { |a,b| a.length <=> b.length }

но вы можете поменять порядок на обратный сортировки:

# longest to shortest
a.sort! { |a,b| b.length <=> a.length }

ответ от @mu слишком короткий, велик, но работает только для чисел. Для общего случая вы можете прибегнуть к sort способ:

 irb> a = ["foo", "foobar", "test"]
  => ["foo", "foobar", "test"]
 irb> a.sort{|a,b| a.length <=> b.length}
 => ["foo", "test", "foobar"]
 irb> a.sort{|a,b| b.length <=> a.length}
 => ["foobar", "test", "foo"]