对具有重复值的哈希数组进行排序
Sort array of hashes having duplicate values
我有以下哈希数组:
arr = [{:id=>1, :val=>30}, {:id=>2, :val=>30}, {:id=>1002, :val=>82}]
我需要:
- 按
:val
和 的值排序
- 如果多个哈希具有相同的值,它们的相对位置应反映原始顺序或相反的顺序,具体取决于按
:val
值排序是升序还是降序
像这样:
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}]
我有以下哈希数组:
arr = [{:id=>1, :val=>30}, {:id=>2, :val=>30}, {:id=>1002, :val=>82}]
我需要:
- 按
:val
和 的值排序
- 如果多个哈希具有相同的值,它们的相对位置应反映原始顺序或相反的顺序,具体取决于按
:val
值排序是升序还是降序
像这样:
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}]
更新:
当然,这不仅限于哈希值。您可以使用元素的索引(如
arr.sort_by.with_index { |h, i| [h[:val], i] }
#=> [{:id=>1, :val=>30}, {:id=>2, :val=>30}, {:id=>1002, :val=>82}]