Ruby:如何在哈希中找到最大值的键?

时间:2011-11-04 11:20:31

标签: ruby hash max

您好我正在尝试查找哈希值中的最大值。 我在谷歌搜索了一下,我找到了这段代码:

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)

在此代码中“puts”打印最大的键和值e.x y300。 那么,我如何修改代码以找到最大值并将其键入to_s变量?

5 个答案:

答案 0 :(得分:8)

这是O(n):

h = {"n" => 100, "m" => 100, "y" => 300, "d" => 200, "a" => 0}
key_with_max_value = h.max_by { |k, v| v }[0] #=> "y"

答案 1 :(得分:4)

这是另一种做你想做的事情。这将找到具有最大值的所有键:

h = {"n" => 100, "m" => 100, "y" => 300, "d" => 200, "a" => 0, "z" => 300}          
max = h.values.max
output_hash = Hash[h.select { |k, v| v == max}]
puts "key(s) for the largest value: #{output_hash.keys}"

#=>key(s) for the largest value: ["y", "z"]

答案 2 :(得分:1)

您可以将方法的第一个语句修改为

key = hash.sort{|a,b| a[1] <=> b[1]}.last[0]

Hash.sort返回一组键值对。 last为您提供具有最大值的键值对。它的第一个元素是相应的键。

答案 3 :(得分:0)

对哈希值进行一次排序,而不是查找最大值。这样你也可以得到最小的等等。

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

h = reverse_sort_hash_value(h)

最大值的关键

max = *h[0][0]

获取最小值的键/值

puts *h[h.length-1]

您可以使用Hash[h.select { |k, v| v == max}]或使用h.to_h

转换为哈希值

答案 4 :(得分:0)

我认为使用你在google上找到的东西并调整它直到它以某种方式运行它并不是一个好主意。如果我们开发软件,我们应该做一些我们理解的事情。

哈希被优化为按键查找值。它未针对值排序或按值的属性进行查找进行优化。所以数据结构对你的问题没有帮助。其他数据结构如树或甚至数组可能更好。

但是如果你因为其他一些原因想要使用哈希,当然有可能。不知何故,你只需要遍历整个哈希。

算法非常简单:遍历整个哈希并检查值是否更大以及之前的最大值:

max_value = 0  # or -Infinity if you have negative values
key_for_max_value = nil

hash.each_pair do | key, value |
  if value > max_value
    max_value = value
    key_for_max_value = key
  end
end
puts "The largest value is #{max_value} and it is has the key #{key_for_max_value}"

其他一些解决方案使用类似排序的技巧,但这只会隐藏复杂性。