web-dev-qa-db-fra.com

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

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

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

100
JZ.

Cela retournera la paire max hash maxi-clé en fonction de la valeur des éléments de hash:

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

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

hash.key(hash.values.max)
34
Tiberiu Macelaru

Une autre façon pourrait être la suivante:

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

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

17
K. George Pradhan

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

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

Si vous souhaitez extraire plus d'une paire de valeurs de clé en fonction de l'ordre (deuxième plus grande, plus petite, etc.), une méthode plus efficace consiste à trier le hachage une fois, puis à 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 paire de clés la plus grande

Hash[*hash[1]]

Pour reconvertir le tableau de hachage en hachage

hash.to_h
3
Linju

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 remplacer &.last Par .try(:last)]. L’un ou l’autre est simplement une sauvegarde pour si votre hachage source est vide: {}

1
JP Duffy