【问题标题】:Selecting the highest value in attribute from hash of arrays从数组的哈希中选择属性中的最大值
【发布时间】:2018-11-22 01:52:33
【问题描述】:

我有这个哈希:

h = {
  124 => ["shoes", "59.99"],
  456 => ["pants", "49.50"],
  352 => ["socks", "3.99"]
}

每个值都有两个元素。它们是名称(例如,"shoes""pants""socks")和价格(例如,"59.99""49.50""3.99")。我需要选择价格最高的值。这将是关键124 和价格"59.99"。如何选择价格最高的哈希?

我试过这个:

h.select{ |x| x[1] }.max
#=> [456, ["pants", "49.50"]]

但这给了我最大值并返回键456

【问题讨论】:

    标签: arrays ruby hash


    【解决方案1】:

    最惯用的可能是这样的:

    h.max_by { |_, v| v.last.to_f }
    #=> [124, ["shoes", "59.99"]]
    

    【讨论】:

    • 我建议你显示返回值:#=> [124, ["shoes", "59.99"]].
    【解决方案2】:

    您可以像这样使用括号来挖掘结构:

    h = {
      124 => ["shoes", "59.99"],
      456 => ["pants", "49.50"],
      352 => ["socks", "3.99"]
    }
    
    h.max_by{|_, (_, price)| price.to_f}
    # => [124, ["shoes", "59.99"]]
    

    【讨论】:

      【解决方案3】:

      您可以先对哈希进行排序:

      sorted = hash.sort_by { |key, value| value[1].to_f }
      # => [[352, ["socks", "3.99"]], [456, ["pants", "49.50"]], [124, ["shoes", "59.99"]]]
      

      然后你可以选择最后一对:

      sorted[-1]
      # => [124, ["shoes", "59.99"]]
      

      【讨论】:

      • 或使用max_by, hash.max_by { |k,v| v.last.to_f }
      • 谢谢你们。你是救生员。
      • 您是按字母顺序排列值,而不是按它们的数值。
      【解决方案4】:

      如果您不介意钥匙,另一种选择可能是:

      h.values.map(&:reverse).max

      #=> ["59.99", "shoes"]

      【讨论】:

      • 请注意,这会将价格作为字符串而不是浮点数进行比较,并且不确定 OP 是否想要这样。
      猜你喜欢
      • 2015-03-06
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 2017-01-16
      相关资源
      最近更新 更多