2009-11-14 57 views
1

我有一個哈希:通過多個值迭代中的散列和返回值

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

我想通過散列數組值和基於所述第三元件,其寵物是最老的年齡上確定。我會選擇max作爲我的方法,我找出哪個值與max相關並返回到屏幕的部分是我沒有得到的部分,或者我完全丟失了?爲了教育目的,我爲了比較數組中不同的元素而拋出了第三個值。

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

回答

2

max迭代由值返回的所有項目,每個項目本身就是一個數組。這是你錯過的一點。

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

max不會返回您正在比較的值,而是返回滿足比較的項目。這在實踐中意味着什麼?這是你的腳本

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

正如你所看到的「工作」的版本,返回的值是整個項目不能用於比較的元素。如果你只想要第三個元素,你必須使用inject

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

你的分析和更好的解決方案。我退出。 – 2009-11-14 10:24:28

+0

感謝您的深入探討。它現在更有意義! – Matt 2009-11-14 11:13:34

3

在ruby 1.8.7中有一個很好的max_by方法。

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

與Greg Dan對早期版本Ruby的迴應類似。

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

如何從max獲取我的值並返回同一數組中的其他元素?很明顯,狗對於.max來說是3,但是我怎樣才能把那個元素放在那個數組中.max我想知道打印字符串Dog?我沒有完全理解.inject塊 – Matt 2009-11-15 11:34:56