К домашке 10-3 использовал следующую конструкцию для выбора максимального значения элемента из файла .json
most_popular_language = cards.invert.max_by{ |value| value[0]}
puts "Самый популярный язык это #{most_popular_language[1]} (#{most_popular_language[0]})"
Верно ли использовать такой подход для поиска максимального элемента в .json (ассоциативных массивах)? Я правильно понимаю, что данный метод преобразовывает найденный элемент из файла .json в элемент двумерного массива?
спасибо
Считаем, что в cards
лежит правильно считанный из json хеш из массива языков программирования как в задаче 10-3.
По порядку:
cards.invert
- получили { 123 => 'Assembler', 555 => 'Ruby' ...
, тоже хэш.
max_by
у массива и хэш массива реализован немного по-разному (это тонкое место, плохо объясняется в доках, тот самый случай когда выручает stackoverflow)
В обычном массиве в блок передается один аргумент: http://ruby-doc.org/core-2.3.0/Enumerable.html#method-i-max_by
В хэше — два: http://stackoverflow.com/questions/6040494/how-to-find-the-key-of-the-largest-value-hash
Правильно будет
cards.invert.max_by{ |key, value| key}
этот метод вернет массив [ключ, значение] того элемента хэша, у которого максимальное значение ключа.
Если вызвать блок с одной переменной, как у вас, это эквивалентно:
cards.invert.max_by{ |key| key}
Тоже сработало бы, если бы не key[0]
, этот метод вызвать у целого числа в руби можно, но смысл другой http://ruby-doc.org/core-2.1.0/Fixnum.html#method-i-5B-5D