Итерация по нескольким значениям в хэше и возвращение значения - PullRequest
1 голос
/ 14 ноября 2009

У меня есть хеш:

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

Я хочу просмотреть значение массива хэшей и определить на основе третьего элемента, какой питомец является самым старшим возрастом. Я выбрал бы max для моего метода, часть, в которой я выясняю, какое значение связано с max, и возвращая его на экран, это часть, которую я не получаю или я полностью потерян? Я добавил третье значение для образовательных целей о том, как сравнивать различные элементы массива.

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

Ответы [ 3 ]

3 голосов
/ 14 ноября 2009

В ruby ​​1.8.7 есть хороший метод max_by.

hash_example.values.max_by {|a| a[2]}
2 голосов
/ 14 ноября 2009

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
1 голос
/ 14 ноября 2009

Аналогично ответу Грега Дана для более ранних версий Ruby.

hash_example.values.collect{|a|a[2]}.max
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...