我有一个哈希数组:

[
  { :foo => 'foo', :bar => 2 },
  { :foo => 'foo', :bar => 3 },
  { :foo => 'foo', :bar => 5 },
]

我试图根据每个哈希中:bar的值降序排序这个数组。

我使用sort_by对上面的数组排序:

a.sort_by { |h| h[:bar] }

但是,这将按升序对数组进行排序。我怎么让它降序排序呢?

一个解决方案是这样做的:

a.sort_by { |h| -h[:bar] }

但这个负号似乎不太合适。


当前回答

是什么:

 a.sort {|x,y| y[:bar]<=>x[:bar]}

它的工作原理!

irb
>> a = [
?>   { :foo => 'foo', :bar => 2 },
?>   { :foo => 'foo', :bar => 3 },
?>   { :foo => 'foo', :bar => 5 },
?> ]
=> [{:bar=>2, :foo=>"foo"}, {:bar=>3, :foo=>"foo"}, {:bar=>5, :foo=>"foo"}]

>>  a.sort {|x,y| y[:bar]<=>x[:bar]}
=> [{:bar=>5, :foo=>"foo"}, {:bar=>3, :foo=>"foo"}, {:bar=>2, :foo=>"foo"}]

其他回答

简单说一下,这表示降序的意图。

descending = -1
a.sort_by { |h| h[:bar] * descending }

(同时会想出更好的办法);)


a.sort_by { |h| h[:bar] }.reverse!

我看到我们(和其他国家)基本上有两个选择:

a.sort_by { |h| -h[:bar] }

and

a.sort_by { |h| h[:bar] }.reverse

虽然当排序键是唯一的时,两种方法都会得到相同的结果,但请记住,相反的方法会颠倒相等的键的顺序。

例子:

a = [{foo: 1, bar: 1},{foo: 2,bar: 1}]
a.sort_by {|h| -h[:bar]}
 => [{:foo=>1, :bar=>1}, {:foo=>2, :bar=>1}]
a.sort_by {|h| h[:bar]}.reverse
 => [{:foo=>2, :bar=>1}, {:foo=>1, :bar=>1}]

虽然你通常不需要关心这个,但有时你会关心。为了避免这种行为,你可以引入第二个排序键(至少对于所有具有相同排序键的项来说,它必须是唯一的):

a.sort_by {|h| [-h[:bar],-h[:foo]]}
 => [{:foo=>2, :bar=>1}, {:foo=>1, :bar=>1}]
a.sort_by {|h| [h[:bar],h[:foo]]}.reverse
 => [{:foo=>2, :bar=>1}, {:foo=>1, :bar=>1}]

是什么:

 a.sort {|x,y| y[:bar]<=>x[:bar]}

它的工作原理!

irb
>> a = [
?>   { :foo => 'foo', :bar => 2 },
?>   { :foo => 'foo', :bar => 3 },
?>   { :foo => 'foo', :bar => 5 },
?> ]
=> [{:bar=>2, :foo=>"foo"}, {:bar=>3, :foo=>"foo"}, {:bar=>5, :foo=>"foo"}]

>>  a.sort {|x,y| y[:bar]<=>x[:bar]}
=> [{:bar=>5, :foo=>"foo"}, {:bar=>3, :foo=>"foo"}, {:bar=>2, :foo=>"foo"}]

从升序到降序的简单解是:

字符串

str = ['ravi', 'aravind', 'joker', 'poker']
asc_string = str.sort # => ["aravind", "joker", "poker", "ravi"]
asc_string.reverse # => ["ravi", "poker", "joker", "aravind"]

数字

digit = [234,45,1,5,78,45,34,9]
asc_digit = digit.sort # => [1, 5, 9, 34, 45, 45, 78, 234]
asc_digit.reverse # => [234, 78, 45, 45, 34, 9, 5, 1]

你可以这样做:

a.sort{|a,b| b[:bar] <=> a[:bar]}