我有一系列称为领导者的结构。对于上下文信息,struct类看起来像这样:
class Leader < Struct.new(:rank, :user); end
两个问题:
答案 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的实现。如文档中所述,它可能不如使用排序的版本有效,具体取决于检索rank
和created_at
值的费用。
按等级排序:
leaders.sort_by {|l| l.rank}
按排名和created_at进行排序:
leaders.sort_by {|l| [l.rank, l.user.created_at]}