2009-11-14 70 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