Подтвердить что ты не робот

Используя sort_by в рубине (для рельсов)?

Итак, я создал собственный массив таких пользователей:

[["user1",432],["user1",53],["user9",58],["user5",75],["user3",62]]

Я хочу отсортировать их по значению 2n'd в каждом массиве, от самого большого до самого маленького. У меня есть чувство, использующее sort или sort_by для массивов, это способ сделать это, но я не уверен, как это сделать.

4b9b3361

Ответ 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