используя sort_by в ruby ​​(для рельсов)? - PullRequest
19 голосов
/ 05 февраля 2012

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

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

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

Ответы [ 3 ]

42 голосов
/ 05 февраля 2012

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

1019 * рода * Решение с использованием sort может быть array.sort { |x, y| y[1] <=> x[1] }

2 голосов
/ 05 февраля 2012

используйте это: array.sort_by { |a| -a[1] }

0 голосов
/ 05 февраля 2012

Еще одно решение для 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...