我在红宝石中有一系列哈希。每个哈希包含一个具有整数值的键“ rating”。我想按此值的降序对数组进行排序。同样,哈希的原始顺序也应保留。如何实现呢?
此代码执行排序,但不保留原始顺序:
new_results = results.sort {|a, b| b["rating"] <=> a["rating"]}
,其中results
是哈希数组。
如果输入数组为:
results = [ { "rating" => 6, "id" => 10699} , { "rating" => 3, "id" => 19985}, { "rating" => 6, "id" => 1029} ]
我希望new_results
是:
[{"rating"=>6, "id"=>10699}, {"rating"=>6, "id"=>1029}, {"rating"=>3, "id"=>19985}]
注意:这仅用于说明。通过上面的代码,我们得到了预期的结果。但是对于我观察到的其他示例,不一定必须保留顺序。
保留顺序意味着如果两个哈希值对rating
具有相同的值,则它们应按照它们在输入数组中的出现顺序出现。
答案 0 :(得分:3)
results = [
{ "rating"=>6, "id"=>10699 },
{ "rating"=>3, "id"=>19985 },
{ "rating"=>6, "id"=>1029 }
]
results.sort_by.with_index { |h,i| [-h["rating"], i] }
#=> [{"rating"=>6, "id"=>10699},
# {"rating"=>6, "id"=>1029}
# {"rating"=>3, "id"=>19985}]
有关Ruby如何排序数组的说明,请参见文档Array#<=>的第三段。当Ruby订购results[0]
和results[2]
时,她将[-6, 0]
与[-6, 2]
进行比较。由于这些数组的前几个元素相等(-6
,因此Ruby将0
与2
进行比较以打破平局,因此results[0]
在results[2]
之前被排序。
请注意,当方法Enumerable#sort_by没有任何块时,它将返回一个枚举数。此处,该枚举器链接到Enumerator#with_index以产生另一个枚举器。