¿Cómo encontrar la clave del hash de mayor valor?

110

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

¿Cómo puedo devolver el par máximo de valor clave usando ruby? Me gustaría que devolviera "CA"

JZ.
fuente
3
¿Qué pasa si hay varias claves con el mismo valor más grande?
Gabe

Respuestas:

230

Esto devolverá el par clave-valor de hash máximo según el valor de los elementos hash:

def largest_hash_key(hash)
  hash.max_by{|k,v| v}
end
Hck
fuente
49
Vale la pena señalar que obtiene una matriz de 2 elementos con [clave, valor]
justingordon
6
hash.max_by {| k, v | v} [0] da la clave.
nfriend21
4
También cabe destacar que un empate irá al primero en orden de posición.
Robbie Guilfoyle
8
También puede hacer hash.max_by (&: last) para el par y hash.max_by (&: last) .first para la clave.
mahemoff
38

Encontré de esta manera, devuelva la clave del primer valor máximo

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

Otra forma podría ser la siguiente:

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

Esto se ejecuta a través de cada par clave-valor y devuelve (o en este caso, pone) la (s) clave (s) donde el valor es igual al máximo de todos los valores. Esto debería devolver más de una clave si hay un empate.

K. George Pradhan
fuente
5

Puede utilizar el método de selección si desea que se devuelva el par clave-valor:

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

Si desea recuperar más de un par clave-valor según el orden (el segundo más grande, el más pequeño, etc.), una forma más eficiente será ordenar el hash una vez y luego obtener los resultados deseados.

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

Clave de mayor valor

puts *hash[0][0]

Obtener máximo y mínimo

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

Segundo par clave-valor más grande

Hash[*hash[1]]

Para convertir la matriz hash de nuevo en un hash

hash.to_h
Linju
fuente
1

Hice esto hoy en un problema similar y terminé con esto:

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

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

Para Ruby inferior a 2.3, puede reemplazarlo &.lastcon .try(:last) Cualquiera de los dos es solo una protección si su hash de origen está vacío:{}

JP Duffy
fuente
-3

Esto devolverá la última clave del hash ordenada por tamaño; sin embargo, puede haber dos claves con el mismo 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
fuente
2
respuesta seleccionada? may_by es mucho mejor que una ordenación de bajo nivel. Es más compacto y usa menos memoria que un sort + last.
tokland