2010-05-19 104 views
1

我有一个称为领导者的结构数组。该结构类看起来是这样的,对上下文信息:对结构数组排序

class Leader < Struct.new(:rank, :user); end 

两个问题:

  1. 我如何结构的按等级排序的数组?
  2. 如何按rank和user.created_at对结构数组进行排序?

回答

5

1.

假设排名是数字:

array.sort {| a, b | a[:rank] <=> b[:rank] } 

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

  2.

array.sort {| a, b | a[:rank] == b[:rank] ? 
    a[:user].created_at <=> b[:user].created_at : 
    a[:rank] <=> b[:rank] } 

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

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

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

然后,你可以这样做:

leaders.sort() 

如果包含Comparable,它会提供其他比较运算符太。

1

这是一个使用sort_by的实现。正如文档中指出的那样,它可能不如使用排序的版本有效,这取决于检索rankcreated_at值的成本有多高。

排序按等级:

leaders.sort_by {|l| l.rank} 

按职级和created_at排序:

leaders.sort_by {|l| [l.rank, l.user.created_at]}