2009-09-16 30 views

回答

19

使用sort_by

array.sort_by{|e| e.something}

sort_lambda = lambda{|e| e.something} 
array.sort_by(&sort_lambda) 

有了後者,你可以重複使用在其他sort_by陳述

5

在Rails,或者說用的ActiveSupport,或Ruby 1.9的sort_lambda(可能是1.8.7,不確定)你可以使用新的快捷熱度:

array.sort_by(&:something) 

請注意,sort_by可能很昂貴(並且可能有益:它取決於排序鍵複雜性)副作用:它爲每個項目生成並存儲一個臨時鍵值對,以便它可以按新鍵排序。有關詳細信息,請參見discussion in the documentation

+0

是的,Ruby 1.8.7的符號#to_proc。 – Chuck 2009-09-16 15:26:10

+0

如果array.sort_on(:something)也起作用,那會很好。 – tadman 2009-09-16 18:06:09

+0

實現它很簡單:'def sort_on(property)sort_by&property end' – Chuck 2009-09-16 20:22:29

5

+1雙方的Eimantas的建議,但我常常有這樣的過程中出現的情況下,我有一個自定義類總是種種這樣,像專輯應該排序不區分大小寫的,忽略了導致標點符號和/一/一個。對於該用途,計算排序值一次更有效,然後相應地重新定義< =>。例如:

class Album 
def sort_value 
    @sv ||= @name.downcase.sub(/^\W*(the|an|a) /,"") 
    end 

    def <=>(other) 
    sort_value <=> (other.sort_value rescue other) 
    end 
end 
0

您是否考慮過在類a和b中包含Comparable,然後調用sort?