对具有重复值的哈希数组进行排序

Sort array of hashes having duplicate values

我有以下哈希数组:

arr = [{:id=>1, :val=>30}, {:id=>2, :val=>30}, {:id=>1002, :val=>82}]

我需要:

像这样:

arr.sort_by_ascending_order.map{|x| x[:id]}
# => [1, 2, 1002] 
arr.sort_by_descending_order.map{|x| x[:id]}
# => [1002, 2, 1]

第二个条件我不敢保证。例如,

arr.sort{|x,y| x[:val] <=> y[:val]}.map{|x| x[:id]}
# => [1, 2, 1002] 
arr.sort{|x,y| y[:val] <=> x[:val]}.map{|x| x[:id]}
# => [1002, 1, 2] 

有人知道怎么解决吗?

你可以提供一个数组:

arr = [{:id=>1, :val=>30}, {:id=>2, :val=>30}, {:id=>1002, :val=>82}]

arr.sort { |x, y| [x[:val], x[:id]] <=> [y[:val], y[:id]] }
#=> [{:id=>1, :val=>30}, {:id=>2, :val=>30}, {:id=>1002, :val=>82}]

arr.sort { |x, y| [y[:val], y[:id]] <=> [x[:val], x[:id]] }
#=> [{:id=>1002, :val=>82}, {:id=>2, :val=>30}, {:id=>1, :val=>30}]

这将首先按 :val 排序,然后按 :id 排序(有关详细信息,请参阅 Array#<=>)。

您也可以使用 sort_by:

arr.sort_by { |h| [h[:val], h[:id]] }
#=> [{:id=>1, :val=>30}, {:id=>2, :val=>30}, {:id=>1002, :val=>82}]

更新:

当然,这不仅限于哈希值。您可以使用元素的索引(如 ) as a secondary sort condition to achieve a stable sort:

arr.sort_by.with_index { |h, i| [h[:val], i] }
#=> [{:id=>1, :val=>30}, {:id=>2, :val=>30}, {:id=>1002, :val=>82}]