【问题标题】:Sort Array of Hashes by value from high to low按值从高到低对哈希数组进行排序
【发布时间】:2023-03-28 23:35:02
【问题描述】:

我有一个这种格式的哈希:

images_found = {
  "results" => [
    {"img_1"=>1.923076923076923},
    {"img_2"=>0.8241758241758242},
    {"img_3"=>0.6868131868131868},
    {"img_4"=>0.5494505494505495},
    {"img_5"=>0.4120879120879121},
    {"img_6"=>0.3434065934065934},
    {"img_7"=>0.2747252747252747},
    {"img_8"=>0.2060439560439561},
    {"img_9"=>0.1373626373626374},
    {"img_10"=>0.06868131868131869},
    {"img_11"=>0.5494505494505495},
    {"img_12"=>0.3434065934065934},
    {"img_13"=>0.2747252747252747},
    {"img_14"=>0.2060439560439561},
    {"img_15"=>0.1373626373626374},
    {"img_16"=>0.06868131868131869}
  ],
  "type" => "SEARCH_RESULTS"
}

我想按值从高到低对images_found["results"] 进行排序,结果将是:

images_found = {
  "results"=> [
    {"img_1"=>1.923076923076923},
    {"img_2"=>0.8241758241758242},
    {"img_3"=>0.6868131868131868},
    {"img_4"=>0.5494505494505495},
    {"img_11"=>0.5494505494505495},
    {"img_5"=>0.4120879120879121},
    {"img_6"=>0.3434065934065934},
    {"img_12"=>0.3434065934065934},
    {"img_7"=>0.2747252747252747},
    {"img_13"=>0.2747252747252747},
    {"img_8"=>0.2060439560439561},
    {"img_14"=>0.2060439560439561},
    {"img_9"=>0.1373626373626374},
    {"img_15"=>0.1373626373626374},
    {"img_10"=>0.06868131868131869},
    {"img_16"=>0.06868131868131869}
  ],
  "type" => "SEARCH_RESULTS"
}

我尝试的解决方案是images_found["results"].sort_by! {|_key, value| value},但它不起作用。

当我尝试调试 value 时,它正在打印 nil

我四处寻找解决方案,但没有找到与此问题陈述相匹配的任何内容。

请推荐!

【问题讨论】:

    标签: arrays ruby sorting hash


    【解决方案1】:

    应该是

    images_found["results"] = images_found["results"].sort_by(&:values).reverse
    

    【讨论】:

      【解决方案2】:

      有多种方法可以获得所需的结果:

      images_found["results"].sort_by! { |x| x.values.first }.reverse!
      

      请注意,带有! 的方法会更改原始哈希。如果您不想更改原始哈希,请删除!

      另一种选择是使用- 符号作为排序条件:

      images_found["results"].sort_by! { |x| - x.values.first }
      

      【讨论】:

      • 这个images_found["results"].sort_by! { |x| - x.values.first } 工作起来就像一个魅力!
      • ! 不是运算符。
      • 您的陈述(不幸的是使用了在 Ruby 中有其他用途的术语 symbol)仍然暗示 ! 是一个对 sort_by 有影响的运算符,这是不正确的. sort_by!sort_by 完全不同。 ! 是一个字符,也是方法名称的一部分。看看文档。不过,为您的第二种方法 +1。
      • 我只是想通过!指出两种易于识别的方法之间的区别。如果它再次造成混乱,我会改变它。
      • 您的第一个结果不正确。返回正确的值,但 image_found["results"] 是通过增加唯一哈希值的值来排序的。问题是reverse 不会更改哈希值。你需要reverse!
      最近更新 更多