Ruby: Как найти ключ наибольшего значения в хэше? - PullRequest
3 голосов
/ 04 ноября 2011

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

в этом коде «кладет» печатает ключ наибольшего значения e.x y300. Итак, как мне изменить код, чтобы найти наибольшее значение и поместить его ключ в переменную to_s?

Ответы [ 5 ]

8 голосов
/ 04 ноября 2011

Это 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"
4 голосов
/ 23 июля 2015

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

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"]
1 голос
/ 04 ноября 2011

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

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

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

0 голосов
/ 29 марта 2016

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

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

0 голосов
/ 29 марта 2016

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

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

...