#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}"
Некоторые другие решения используют трюки, такие как сортировка массива, но это только скрывает сложность.