Como encontrar a chave do maior valor hash?

110

Eu tenho o seguinte hash {"CA"=>2, "MI"=>1, "NY"=>1}

Como posso retornar o par de valores-chave máximo usando ruby? Eu gostaria que retornasse "CA"

JZ.
fonte
3
E se houver várias chaves com o mesmo valor maior?
Gabe

Respostas:

230

Isso retornará o par de valor-chave hash máximo, dependendo do valor dos elementos hash:

def largest_hash_key(hash)
  hash.max_by{|k,v| v}
end
Hck
fonte
49
vale a pena observar que você obtém uma matriz de 2 elementos com [chave, valor]
justingordon
6
hash.max_by {| k, v | v} [0] fornece a chave.
nfriend21
4
Também é importante notar que um empate irá para o primeiro lugar na ordem de posição.
Robbie Guilfoyle
8
Você também pode fazer hash.max_by (&: last) para o par e hash.max_by (&: last) .first para a chave.
mahemoff de
38

Eu encontrei assim, retorna a chave do primeiro valor máximo

hash.key(hash.values.max)
Tiberiu Macelaru
fonte
16

Outra forma poderia ser a seguinte:

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

Isso percorre cada par de valor-chave e retorna (ou, neste caso, puts) a (s) chave (s) onde o valor é igual ao máximo de todos os valores. Isso deve retornar mais de uma chave se houver um empate.

K. George Pradhan
fonte
5

Você pode usar o método de seleção se quiser que o par de valores-chave seja retornado:

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

Se você deseja recuperar mais de um par de valores-chave com base na ordem (segundo maior, menor etc.), uma maneira mais eficiente será classificar o hash uma vez e obter os resultados desejados.

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

Chave de maior valor

puts *hash[0][0]

Obtenha máximo e mínimo

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

2º maior par de valores-chave

Hash[*hash[1]]

Para converter a matriz hash de volta em um hash

hash.to_h
Linju
fonte
1

Eu fiz isso hoje com um problema semelhante e acabei com o seguinte:

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

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

Para Ruby inferior a 2,3, você pode substituir &.lastpor .try(:last) Qualquer um é apenas uma proteção caso o hash de origem esteja vazio:{}

JP Duffy
fonte
-3

Isso retornará a última chave do hash classificado por tamanho; no entanto, pode haver duas chaves com o mesmo valor.

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
fonte
2
resposta selecionada? may_by é muito melhor do que uma classificação de baixo nível. É mais compacto e usa menos memória do que um sort + last.
tokland