我有以下哈希
{"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 }
这会遍历每个键值对,并返回(或在本例中为 put)键,其中值等于所有值的最大值。如果存在平局,这应该返回多个键。
如果你想根据顺序检索多个键值对(第二大、最小等),一种更有效的方法是对哈希进行一次排序,然后得到所需的结果。
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)
如果您的源哈希为空,任一者都只是一种保障:{}
提供的答案假设存在“单个最大值”。但是,它可能有重复项。要返回最大值的键(包括任何重复项),您可以使用以下方法之一:
Enumerable#select
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)