¿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"


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

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)

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.


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 }

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

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:{}


-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)

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.