【问题标题】:How to find the key of the largest value hash?如何找到最大值哈希的键?
【发布时间】:2011-08-27 18:48:47
【问题描述】:

我有以下哈希{"CA"=>2, "MI"=>1, "NY"=>1}

如何使用 ruby​​ 返回最大键值对?我希望它返回“CA”

【问题讨论】:

  • 如果有多个key的最大值相同怎么办?

标签: ruby hash


【解决方案1】:

这将根据散列元素的值返回最大散列键值对:

def largest_hash_key(hash)
  hash.max_by{|k,v| v}
end

【讨论】:

  • 值得注意的是,您会返回一个包含 [key, value] 的 2 元素数组
  • hash.max_by{ |k,v| v }[0] 给出密钥。
  • 另外值得注意的是,平局将按位置顺序排在第一位。
  • 你也可以对键做 hash.max_by(&:last) 和 hash.max_by(&:last).first 。
  • 请注意,如果哈希为空,这将不起作用。
【解决方案2】:

我找到了这种方式,返回第一个最大值的key

hash.key(hash.values.max)

【讨论】:

  • 虽然hash[key] 非常高效,但hash.key(value) 必须搜索整个哈希。这个答案搜索哈希两次:首先找到最大值,然后找到与该值匹配的键。
【解决方案3】:

另一种方式可能如下:

hash.each { |k, v| puts k if v == hash.values.max }

这将遍历每个键值对并返回(或在本例中为 puts 的)值等于所有值的最大值的键。如果有平局,这应该返回多个键。

【讨论】:

    【解决方案4】:

    如果您想根据顺序(第二大、最小等)检索多个键值对,一种更有效的方法是对哈希进行一次排序,然后得到所需的结果。

    def descend_sort(hash)
       hash = hash.sort_by {|k,v| v}.reverse
    end
    

    最大值的键

    puts *hash[0][0]
    

    获取最大值和最小值

    puts *hash[0], *hash[hash.length-1]
    

    第二大键值对

    Hash[*hash[1]]
    

    将散列数组转换回散列

    hash.to_h
    

    【讨论】:

      【解决方案5】:

      如果要返回键值对,可以使用select方法:

      hash.select {|k,v| v == hash.values.max }
      

      【讨论】:

        【解决方案6】:

        我今天在一个类似的问题上做了这个,结果是这样的:

        hash = { "CA"=>2, "MI"=>1, "NY"=>1 }
        
        hash.invert.max&.last
        => "CA" 
        

        对于低于 2.3 的 Ruby,您可以将 &.last 替换为 .try(:last) 如果您的源哈希为空,任何一个都只是一种保障:{}

        【讨论】:

          【解决方案7】:

          这将返回按大小排序的哈希的最后一个键;但是,可能有两个具有相同值的键。

          def largest_hash_key(hash)
            key = hash.sort{|a,b| a[1] <=> b[1]}.last
            puts key
          end
          
          hash = { "n" => 100, "m" => 100, "y" => 300, "d" => 200, "a" => 0 }
          largest_hash_key(hash)
          

          【讨论】:

          • 选择的答案? may_by 比低级排序要好得多。它比 sort+last 更紧凑,使用的内存更少。
          猜你喜欢
          • 2012-10-11
          • 2017-06-20
          • 1970-01-01
          • 2014-08-03
          • 1970-01-01
          • 1970-01-01
          • 2018-04-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多