web-dev-qa-db-fra.com

utiliser sort_by en Ruby (pour Rails)?

J'ai donc construit un tableau personnalisé d'utilisateurs tels que:

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

Je veux les trier par la valeur 2n'd dans chaque tableau, du plus grand au plus petit. J'ai l'impression d'utiliser sort ou sort_by pour les tableaux, mais je ne sais pas trop comment y arriver.

19
Elliot

trier par

Si vous êtes intéressé par sort_by, vous pouvez déstructurer vos tableaux internes.

array.sort_by { |_, x| x }.reverse

ou appelez l'opérateur d'index

array.sort_by { |x| x[1] }.reverse

Au lieu d'inverser, vous pouvez annuler les valeurs renvoyées par le bloc.

array.sort_by { |_, x| -x }
array.sort_by { |x| -x[1] }

Une autre solution consisterait à utiliser un esperluette et Array#last.

array.sort_by(&:last).reverse

trier

Une solution utilisant sort pourrait être

array.sort { |x, y| y[1] <=> x[1] }
42
Jan

utilisez ceci: array.sort_by { |a| -a[1] }

2
Vasiliy Ermolovich

Une solution supplémentaire pour sort_by à l'envers (- ne fonctionne pas dans tous les cas, pensez à trier par chaîne):

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"]

Il est plus lent que l'inverse dans les cas simples, mais peut mieux fonctionner avec des tris complexes:

objs.sort_by do |obj|  
  [obj.name, obj.date.invertible, obj.score, ...]
end
0
Victor Moroz