繁体   English   中英

如何对具有多个值的哈希数组进行排序?

[英]How to sort an array of hashes with multiple values?

我有一个哈希数组,其中包含一个id字段和一个weight字段。 我可以根据weight对其进行排序,但我还需要确保如果存在重复权重,则对id字段进行排序。 下面是代码片段供参考。

# Input
arr = [{"id" => 10, "weight" => 23}, {"id" => 6, "weight" => 43}, {"id" => 12, "weight" => 5}, {"id" => 15, "weight" => 30}, {"id" => 11, "weight" => 5}]

arr.sort_by{|k| k["weight"]}

# Output: [{"id"=>12, "weight"=>5}, {"id"=>11, "weight"=>5}, {"id"=>10, "weight"=>23}, {"id"=>15, "weight"=>30}, {"id"=>6, "weight"=>43}]

# Expected output = [{"id"=>11, "weight"=>5}, {"id"=>12, "weight"=>5}, {"id"=>10, "weight"=>23}, {"id"=>15, "weight"=>30}, {"id"=>6, "weight"=>43}]

在上面的示例中, id = 12id = 11具有重复值。 我需要在数组中的id = 12之前有id = 11 我真的很感谢这方面的一些指导。 谢谢!

您也可以将Enumerable#sort_by与数组一起使用。 请注意数组中值的顺序。

arr.sort_by {|k| k.values_at("weight", "id") }

引用Array#<=>文档中关于Array#<=>比较如何工作的内容:

数组以“元素方式”的方式进行比较; 使用<=>运算符将ary的第一个元素与other_ary的第一个元素进行比较,然后是每个第二个元素,等等……只要任何此类比较的结果非零(即两个对应元素不相等) ),则返回整个数组比较的结果。

您可以将Array#sortspaceship 运算符一起使用,如下所示:

arr.sort do |a,b|
  if a["weight"] == b["weight"]
    a["id"] <=> b["id"]
  else
    a["weight"] <=> b["weight"]
  end
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM