@arruah

Как отсортировать вложенный хеш по среднему значению в ruby?

Есть хеш следущего вида:
movies = {
  1 "Interstellar" => {
  2 "John" => 10,
  3 "Jack" => 3
  4 },
  5 "Psyho" => {
  6 "Jack" => 9,
  7 "Jane" => 10
  8 },
  9 "Seven" => {
 10 
 11 }
 12 }

Необходимо найти среднее значение рейтинга для каждого фильма и вывести список фильмов отсортированными по убыванию.
Средний рейтинг я вычислил так:
movies.each do |x|
     current_movie = x[0]
    avg_rate = movies[current_movie].values.map.sum.fdiv(movies[current_movie].size)
     if movies[current_movie].empty?
      puts "Rating is not available for #{x[0]}"
     else
     puts "#{x[0]} is rated #{avg_rate.to_s}"
     end
    end

Я не уверен каким способом отсортировать вывод. Как я вижу нужно создать новый хеш, записать туда данные ключ = > значение как movie => avg_rating и сделать .sort.
Либо есть другое более короткое решение?
  • Вопрос задан
  • 133 просмотра
Решения вопроса 1
nbekseitov
@nbekseitov
Ruby developer
sorted_ratings = movies.each_with_object({}) do |(name, votes), hash|
  sum = votes.values.sum
  hash[name] = sum.nonzero? ? sum.to_f / votes.count : 0
end.sort_by(&:last).reverse

sorted_ratings.each do |name, rating|
  if rating.nonzero?
    puts "#{name} is rated #{rating}"
  else
    puts "Rating is not available for #{name}"
  end
end
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы