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

您好我正在尝试找到哈希值中的最大值。 我在谷歌搜索,我发现这个代码:

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”打印出最大的键和值ex y300。 那么,我如何修改代码以找到最大值并将其键入to_s变量?

这是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" 

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

 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"] 

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

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

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

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

 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}]转换为哈希Hash[h.select { |k, v| v == max}] Hash[h.select { |k, v| v == max}]或使用h.to_h

我认为使用你在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}" 

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