2009-11-14 2 views
1

J'ai un hachage:Itération à travers plusieurs valeurs dans un hachage et retourne une valeur

hash_example = {777 =>[dog,brown,3], 123=>[cat,orange,2]} 

Je veux passer par la valeur de tableau de hachage et déterminer, en fonction du troisième élément qui animal est le plus ancien âge. Je choisirais le max pour ma méthode, la partie où je devine quelle valeur est associée à max et le renvoyant à l'écran est la partie que je ne reçois pas, ou suis-je complètement perdu? J'ai jeté la troisième valeur là-bas à des fins éducatives sur la façon de comparer différents éléments du tableau.

b = hash_example.values.max{|k,b,c| b<=>c } 
print b 

Répondre

2

max itère tous les éléments renvoyés par des valeurs et chaque élément est un tableau lui-même. C'est le point que vous manquez.

> hash_example.values 
# => [["dog", "brown", 3], ["cat", "orange", 2]] 

max ne retourne pas la valeur que vous comparez contre, au contraire, il renvoie l'élément qui satisfait la comparaison. Qu'est-ce que cela signifie en pratique? Voici la version « travail » de votre script

> hash_example.values.max{|a,b| a[2]<=>b[2] } 
# => ["dog", "brown", 3] 

Comme vous pouvez le voir, la valeur retournée est l'élément complet de l'élément utilisé pour la comparaison. Si vous voulez seulement le troisième élément, vous devez utiliser inject.

> hash_example.values.inject(0) {|t,i| i[2] > t ? i[2] : t } 
# => 3 
+0

Votre analyse est la meilleure et la meilleure solution. Je me retire. –

+0

Merci pour l'explication approfondie. Cela fait beaucoup plus de sens maintenant! – Matt

3

Dans ruby ​​1.8.7, il y a une bonne méthode max_by.

hash_example.values.max_by {|a| a[2]} 
1

Similaire à la réponse de Greg Dan pour les versions antérieures de Ruby.

hash_example.values.collect{|a|a[2]}.max 
+0

Comment puis-je prendre ma valeur de max et retourner un élément différent dans le même tableau? Évidemment chien est 3 pour .max mais comment est-ce que je mets que l'élément dans ce tableau est .max je veux savoir imprimer la chaîne Chien? Je n'ai pas entièrement compris le bloc .inject – Matt

Questions connexes