按哈希属性值的降序对哈希数组进行排序,以保留哈希的初始顺序

时间:2019-07-04 05:38:22

标签: ruby sorting

我在红宝石中有一系列哈希。每个哈希包含一个具有整数值的键“ 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具有相同的值,则它们应按照它们在输入数组中的出现顺序出现。

1 个答案:

答案 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将02进行比较以打破平局,因此results[0]results[2]之前被排序。

请注意,当方法Enumerable#sort_by没有任何块时,它将返回一个枚举数。此处,该枚举器链接到Enumerator#with_index以产生另一个枚举器。