Comment trouver la clé du hachage de la plus grande valeur?


110

J'ai le hachage suivant {"CA"=>2, "MI"=>1, "NY"=>1}

Comment puis-je renvoyer la paire valeur / clé maximale à l'aide de ruby? Je voudrais qu'il renvoie "CA"


3
Que faire s'il y a plusieurs clés avec la même valeur la plus élevée?
Gabe

Réponses:


230

Cela renverra la paire clé-valeur de hachage maximale en fonction de la valeur des éléments de hachage:

def largest_hash_key(hash)
  hash.max_by{|k,v| v}
end

49
à noter que vous récupérez un tableau à 2 éléments avec [clé, valeur]
justingordon

6
hash.max_by {| k, v | v} [0] donne la clé.
nfriend21

4
Il convient également de noter qu'une égalité ira en premier par ordre de position.
Robbie Guilfoyle

8
Vous pouvez également faire hash.max_by (&: last) pour la paire et hash.max_by (&: last) .first pour la clé.
mahemoff

38

J'ai trouvé de cette façon, retourne la clé de la première valeur max

hash.key(hash.values.max)

16

Une autre façon pourrait être la suivante:

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

Cela parcourt chaque paire clé-valeur et renvoie (ou dans ce cas met) la ou les clés où la valeur est égale au maximum de toutes les valeurs. Cela devrait renvoyer plus d'une clé en cas d'égalité.


5

Vous pouvez utiliser la méthode de sélection si vous souhaitez que la paire clé / valeur soit renvoyée:

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

4

Si vous souhaitez récupérer plus d'une paire clé / valeur en fonction de l'ordre (deuxième plus grand, plus petit, etc.), un moyen plus efficace sera de trier le hachage une fois, puis d'obtenir les résultats souhaités.

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

Clé de plus grande valeur

puts *hash[0][0]

Obtenez max et min

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

2e plus grande paire valeur / clé

Hash[*hash[1]]

Pour reconvertir le tableau de hachage en un hachage

hash.to_h

1

Je l'ai fait aujourd'hui sur un problème similaire et je me suis retrouvé avec ceci:

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

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

Pour Ruby inférieur à 2.3, vous pouvez le remplacer &.lastpar l' .try(:last) un ou l'autre n'est qu'une sauvegarde si votre hachage source est vide:{}


-3

Cela renverra la dernière clé du hachage triée par taille; cependant, il peut y avoir deux clés avec la même valeur.

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
réponse choisie? may_by est bien meilleur qu'un tri de bas niveau. Il est plus compact et utilise moins de mémoire qu'un tri + dernier.
tokland
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.