如何找到最大值哈希的键



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

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

这将返回最大哈希键值对,具体取决于哈希元素的值:

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

我发现这样,返回第一个最大值的键

hash.key(hash.values.max)

另一种方式如下:

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

这贯穿每个键值对,并返回(或在本例中放置)值等于所有值最大值的键。如果存在平局,这应该返回多个密钥。

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

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

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

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

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

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

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

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

  1. Enumerable#select ;
  2. Hash#each
# 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]

为那些有兴趣了解更多信息的人写了一篇博客文章。

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

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)

最新更新