2010-05-19 106 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]}