Ruby: как найти ключ с наибольшим значением в хэше?

#ruby #hash #max

#ruby #хэш #макс

Вопрос:

Здравствуйте, я пытаюсь найти наибольшее значение в моем хэше. Я сделал поиск в Google и нашел этот код:

 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» печатает наибольший ключ и значение, например, y300.
Итак, как я могу изменить код, чтобы найти наибольшее значение и поместить его ключ в переменную to_s?

Ответ №1:

Это 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. @George: старая версия Ruby? попробуйте установить и использовать gem «backports»

Ответ №2:

Вот еще один способ сделать то, что вы хотите. Это позволит найти все ключи с максимальным значением:

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

Ответ №3:

Вы можете изменить первое утверждение вашего метода на

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

Hash.sort возвращает массив пар ключ-значение. last получает пару ключ-значение с наибольшим значением. Его первым элементом является соответствующий ключ.

Ответ №4:

Отсортируйте хэш один раз вместо поиска максимального значения. Таким образом, вы также можете получить наименьшее значение и т.д.

 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

Ответ №5:

Я думаю, что не очень хорошая идея использовать что-то, что вы найдете в 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}"
  

Некоторые другие решения используют трюки, такие как сортировка массива, но это только скрывает сложность.