对结构体数组进行排序

4

我有一个名为leaders的结构数组。结构体的类如下,以提供上下文信息:

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

两个问题:

  1. 如何按排名对结构数组进行排序?
  2. 如何按排名和用户创建时间对结构数组进行排序?
2个回答

9

假设“rank”是一个数字:

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 进行比较。否则,我们就按照等级进行比较。

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

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

然后您可以执行以下操作:

leaders.sort()

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

3

这里使用了 sort_by 来实现。正如文档中所述,根据检索 rankcreated_at 值的成本而言,它可能比使用 sort 更低效。

按排名排序:

leaders.sort_by {|l| l.rank}

按等级和创建时间排序:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接