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

110

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

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

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

Ответы:

230

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

def largest_hash_key(hash)
  hash.max_by{|k,v| v}
end
Hck
источник
49
Стоит отметить, что вы получаете массив из 2 элементов с [ключ, значение]
Justingordon
6
hash.max_by {| k, v | v} [0] дает ключ.
nfriend21
4
Также стоит отметить, что ничья будет первой по порядку позиций.
Робби Гилфойл,
8
Вы также можете сделать hash.max_by (&: last) для пары и hash.max_by (&: last) .first для ключа.
mahemoff
38

Я нашел так, верните ключ первого максимального значения

hash.key(hash.values.max)
Тибериу Маселару
источник
16

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

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

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

К. Джордж Прадхан
источник
5

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

hash.select {|k,v| v == hash.values.max }
ecoding5
источник
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) Любой из них - это просто гарантия, если ваш исходный хеш пуст:{}

JP Даффи
источник
-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)
thenengah
источник
2
выбранный ответ? may_by намного лучше, чем сортировка низкого уровня. Он более компактен и использует меньше памяти, чем sort + last.
tokland