Как найти ключ хеша наибольшего значения?


110

У меня есть следующий хеш {"CA"=>2, "MI"=>1, "NY"=>1}

Как я могу вернуть пару максимального значения ключа с помощью ruby? Я бы хотел вернуть "CA"


3
Что делать, если есть несколько ключей с одинаковым наибольшим значением?
Гейб

Ответы:


230

Это вернет максимальную пару ключ-значение хеша в зависимости от значения хеш-элементов:

def largest_hash_key(hash)
  hash.max_by{|k,v| v}
end

49
Стоит отметить, что вы получаете массив из 2 элементов с [ключ, значение]
Justingordon

6
hash.max_by {| k, v | v} [0] дает ключ.
nfriend21

4
Также стоит отметить, что ничья будет первой по порядку позиций.
Робби Гилфойл,

8
Вы также можете сделать hash.max_by (&: last) для пары и hash.max_by (&: last) .first для ключа.
mahemoff


16

Другой способ мог быть следующим:

hash.each { |k, v| puts k if v == hash.values.max }

Он проходит через каждую пару «ключ-значение» и возвращает (или в данном случае помещает) ключ (и), где значение равно максимальному из всех значений. Это должно вернуть более одного ключа, если есть ничья.


5

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

hash.select {|k,v| v == hash.values.max }

4

Если вы хотите получить более одной пары значений ключа в зависимости от порядка (второй по величине, наименьший и т. Д.), Более эффективным способом будет один раз отсортировать хэш и затем получить желаемые результаты.

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

Ключ наибольшего значения

puts *hash[0][0]

Получите максимум и минимум

puts *hash[0], *hash[hash.length-1]

2-я по величине пара "ключ-значение"

Hash[*hash[1]]

Чтобы преобразовать хеш-массив обратно в хеш

hash.to_h

1

Я сделал это сегодня по аналогичной проблеме и в итоге получил следующее:

hash = { "CA"=>2, "MI"=>1, "NY"=>1 }

hash.invert.max&.last
=> "CA" 

Для Ruby менее 2.3 вы можете заменить &.lastна. .try(:last) Любой из них - это просто гарантия, если ваш исходный хеш пуст:{}


-3

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

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)

2
выбранный ответ? may_by намного лучше, чем сортировка низкого уровня. Он более компактен и использует меньше памяти, чем sort + last.
tokland
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.