Задача 10-3: Использование метода max_by

[Е] Егор, 21 июля 2016, 19:51 , 2 подписчика

К домашке 10-3 использовал следующую конструкцию для выбора максимального значения элемента из файла .json

most_popular_language = cards.invert.max_by{ |value| value[0]}
puts "Самый популярный язык это #{most_popular_language[1]} (#{most_popular_language[0]})"

Верно ли использовать такой подход для поиска максимального элемента в .json (ассоциативных массивах)? Я правильно понимаю, что данный метод преобразовывает найденный элемент из файла .json в элемент двумерного массива?

спасибо

Обсуждение (1)


Michael Butlitsky Учитель

[M]

Считаем, что в 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