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"

JZ.
la source
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
Hck
la source
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)
Tiberiu Macelaru
la source
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é.

K. George Pradhan
la source
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 }
écodage5
la source
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
Linju
la source
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:{}

JP Duffy
la source
-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)
alorsengah
la source
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