Як знайти ключ хеша з найбільшим значенням?


110

У мене є такий хеш {"CA"=>2, "MI"=>1, "NY"=>1}

Як я можу повернути максимальну пару ключових значень за допомогою рубіну? Я хотів би, щоб він повернув "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) .перше для ключа.
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) Either - це лише гарантія, якщо ваш вихідний хеш порожній:{}


-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 набагато краще, ніж сорт низького рівня. Він більш компактний і використовує менше пам'яті, ніж сорт + останній.
токленд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.