Используя sort_by в рубине (для рельсов)?
Итак, я создал собственный массив таких пользователей:
[["user1",432],["user1",53],["user9",58],["user5",75],["user3",62]]
Я хочу отсортировать их по значению 2n'd в каждом массиве, от самого большого до самого маленького. У меня есть чувство, использующее sort или sort_by для массивов, это способ сделать это, но я не уверен, как это сделать.
Ответы
Ответ 1
sort_by
Если вас интересует sort_by
, вы можете разрушить свои внутренние массивы
array.sort_by { |_, x| x }.reverse
или вызовите оператор индекса
array.sort_by { |x| x[1] }.reverse
Вместо реверсирования вы можете отменить значения, возвращаемые из блока.
array.sort_by { |_, x| -x }
array.sort_by { |x| -x[1] }
Еще одна альтернатива - использовать амперсанд и Array#last
.
array.sort_by(&:last).reverse
сортировать
Решение с использованием sort
может быть
array.sort { |x, y| y[1] <=> x[1] }
Ответ 2
используйте это: array.sort_by { |a| -a[1] }
Ответ 3
Еще одно решение для sort_by
в обратном порядке (-
не работает во всех случаях, подумайте о сортировке по строке):
class Invertible
include Comparable
attr_reader :x
def initialize(x)
@x = x
end
def <=> (x)
x.x <=> @x
end
end
class Object
def invertible
Invertible.new(self)
end
end
[1, 2, 3].sort_by(&:invertible) #=> [3, 2, 1]
["a", "b", "c"].sort_by(&:invertible) #=> ["c", "b", "a"]
В простом случае он медленнее, чем обратный, но может работать лучше со сложными типами:
objs.sort_by do |obj|
[obj.name, obj.date.invertible, obj.score, ...]
end