对结构数组进行排序

时间:2010-05-19 23:20:49

标签: ruby-on-rails arrays sorting struct

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

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

两个问题:

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

2 个答案:

答案 0 :(得分:7)

1

假设排名是数字:

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

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

2。

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

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

您可以实施&lt; =&gt;在你自己的类中允许本地排序:

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

然后你可以这样做:

leaders.sort()

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

答案 1 :(得分:2)

这是使用sort_by的实现。如文档中所述,它可能不如使用排序的版本有效,具体取决于检索rankcreated_at值的费用。

按等级排序:

leaders.sort_by {|l| l.rank}

按排名和created_at进行排序:

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