对结构数组进行排序

ker*_*lin 2 arrays sorting struct ruby-on-rails

我有一系列称为领导者的结构.对于上下文信息,struct类看起来像这样:

class Leader < Struct.new(:rank, :user); end
Run Code Online (Sandbox Code Playgroud)

两个问题:

  1. 如何按排名对结构数组进行排序?
  2. 如何按排名和user.created_at对结构数组进行排序?

Mat*_*hen 7

1.

假设排名是数字:

array.sort {| a, b | a[:rank] <=> b[:rank] }
Run Code Online (Sandbox Code Playgroud)

这只是指定我们比较a和b使用[:rank].

2. 

array.sort {| a, b | a[:rank] == b[:rank] ? 
    a[:user].created_at <=> b[:user].created_at : 
    a[:rank] <=> b[:rank] }
Run Code Online (Sandbox Code Playgroud)

这使用三元组.如果排名相等,我们按[:user] .created_at进行比较.否则,我们按行列进行比较.

您可以在自己的类中实现<=>以允许本机排序:

class Leader < Struct.new(:rank, :user)
  def <=>(other)
    self[:rank] <=> other[:rank]
  end
end
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

leaders.sort()
Run Code Online (Sandbox Code Playgroud)

如果包含Comparable,它也将提供其他比较运算符.