如何找到最大哈希值的key?

问题描述 投票:0回答:8

我有以下哈希

{"CA"=>2, "MI"=>1, "NY"=>1}

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

ruby hash
8个回答
262
投票

这将根据哈希元素的值返回最大哈希键值对:

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

49
投票

我找到了这个方法,返回第一个最大值的键

hash.key(hash.values.max)

15
投票

另一种方法如下:

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

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


5
投票

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

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

4
投票

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

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

4
投票

我今天在类似的问题上做了这个,最终得到了这个:

hash = { "CA"=>2, "MI"=>1, "NY"=>1 }

hash.invert.max&.last
=> "CA" 

对于低于 2.3 的 Ruby,您可以将

&.last
替换为
.try(:last)
如果您的源哈希为空,任一者都只是一种保障:
{}


-2
投票

提供的答案假设存在“单个最大值”。但是,它可能有重复项。要返回最大值的键(包括任何重复项),您可以使用以下方法之一:

    Enumerable#select
  1. Hash#each
  2. 
    
  3. # 1: using `Enumerable#select` def max_value_keys(hash) max_value = hash.values.max max_values = hash.select { | key, value | value == max_value } max_values.keys end print max_value_keys({ a: 20, b: 50, c: 30 }) #=> [:b] print max_value_keys({ a: 20, b: 50, c: 50 }) #=> [:b, :c]
# 2: using `Hash#each`

def max_value_keys(hash)
  max_value = nil
  keys = []

  hash.each do | key, value |
    if max_value.nil? || value > max_value
      max_value = value
      keys = [key]
    elsif value == max_value
      keys << key
    end
  end

  keys
end

print max_value_keys({ a: 20, b: 50, c: 30 }) #=> [:b]
print max_value_keys({ a: 20, b: 50, c: 50 }) #=> [:b, :c]
我写了一篇关于此的
博客文章

,这对于有兴趣了解更多信息的人可能有用。


-3
投票

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)

© www.soinside.com 2019 - 2024. All rights reserved.