2012-05-22 18 views
6

Aquí es un hash que realiza un seguimiento de la cantidad de cada fruta tengoRubí: obtener par hash con valor máximo

 
fruits = {"apples" => 10, "pears" => 15, "bananas" => 15, "grapes" => 12} 

Y yo quiero saber qué fruta que tengo la mayor parte de.
Si hay tie-breakers, solo devuelva todos.

+1

sentimos , No logré obtener la parte de 'desempate'. Si el hash es el de tu ejemplo, ¿me gustaría devolver todos? –

+0

@Keikoku, ¿puedes aclarar qué significa "devolver todos"? ¿Significa devolver todo el hash? ¿O significa devolver solo esas llaves atadas por el valor superior? –

+0

devuelve solo aquellos que están vinculados por el valor superior – MxyL

Respuesta

8
# easy 
max_quantity = fruits.values.max 
max_fruits = fruits.select { |k, v| v == max_quantity }.keys 

# fast                   
max_quantity = -1.0/0.0 
max_fruits = [] 
fruits.each do |k, v| 
    if v > max_quantity 
    max_quantity = v 
    max_fruits = [] 
    end 
    max_fruits.push k if v == max_quantity 
end 

Como los casos excepcionales son malos (tm), ambos siempre devuelven una matriz.

+0

El bloque de selección es más lento que el otro? – MxyL

+0

No he medido. Para estar seguro, uno es en su mayoría nativo, el otro en su mayoría Ruby, así que en realidad podría ser incorrecto: p pero el superior hará cuatro bucles sobre los datos ('values',' max', 'select',' keys'), el inferior solo hará el uno. El superior es definitivamente más legible, y en la práctica la ventaja de velocidad, incluso si existe, sería insignificante. El mejor valor del ejemplo inferior es en realidad aprender cómo puede hacerlo usted mismo, sin la ayuda de la biblioteca. – Amadan

6
max_value = fruits.values.max 
keys = fruits.select{|k, v| v == max_value}.keys 
+0

No resuelve el problema "Si hay tie-breakers, devuélvalos todos". – Amadan

+0

Oh, me lo perdí. – xdazz

0

Una respuesta más corto que utiliza Ruby's Select método para devolver hash del valor más alto (s) (incluidos los criterios de desempate)

most_fruit = fruits.select {|x,i| i == fruits.values.max} 

ejemplo:

fruits = {"apples" => 10, "pears" => 15, "bananas" => 15, "grapes" => 12} 
fruits.select {|x,i| i == fruits.values.max } 

salida

{"pears"=>15, "bananas"=>15}

Cuestiones relacionadas