2009-09-16 60 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?