2012-11-04 34 views
6

可能重复:
Sorting an array in descending order in Ruby红宝石排序阵列以相反的顺序

我要排序基于一些条件元件的阵列,除了以相反的顺序。基本上,无论它会做什么,然后扭转。

所以,比如我有一个字符串数组,我想通过减少字符串长度

a = ["test", "test2", "s"] 
a.sort_by!{|str| str.length}.reverse! 

虽然这工作排序它...是否有指定使得分类条件的方式算法会做到相反?

回答

21

长度是一个数字,所以你可以简单地否定它颠倒顺序:

a.sort_by! { |s| -s.length } 

如果你的东西,是不会轻易被否定,然后排序,你可以使用sort!和手动反向的比较。例如,通常你可以这样做:

# shortest to longest 
a.sort! { |a,b| a.length <=> b.length } 

,但你可以调换顺序颠倒排序:

# longest to shortest 
a.sort! { |a,b| b.length <=> a.length } 
+0

哦,这是一个很好的把戏! – MxyL

+1

+1输入比我快:P – Thilo

+1

性能明智,这是更好的(如果你问我更多的语义):'a.sort_by(&:length).reverse' – Mosselman

6

从@mu答案是太短是伟大的,但只适用于数字。对于一般情况,您可以使用sort方法:

irb> a = ["foo", "foobar", "test"] 
    => ["foo", "foobar", "test"] 
irb> a.sort{|a,b| a.length <=> b.length} 
=> ["foo", "test", "foobar"] 
irb> a.sort{|a,b| b.length <=> a.length} 
=> ["foobar", "test", "foo"] 
+0

呃,他输入更快...... :) – Thilo

+4

'sort_by(&:length).reverse'将更具可读性和速度。 –

+0

我同意,但那不是问题。 – Thilo