2016-12-29 8 views
0

У меня есть пример хэша, который имеет два элемента (section_one и section_two) в Ruby. Я хочу суммировать каждый элемент отдельно и оценивать каждое среднее значение элемента.Подводя итог нескольким значениям массива в hash - Ruby

Мой хэш:

class_grades = { 
    :section_one => [88, 74, 64], 
    :section_two => [99, 100] 
} 

Я примерил этот код

sum = 0 
class_grades.each do |key, value| 
    value.each do |value1| 
    sum += value1 
    end 
    puts "#{key}: #{sum.to_f}" 
end 

но оказывается результатом:

section_one: 226.0 
section_two: 425.0 

У меня есть проблема подытожить каждый элемент отдельно. Он оценивает первый элемент и продолжается. Не могли бы вы помочь мне решить эту проблему.

ответ

0

Во-первых, с минимальным редактированием кода:

class_grades.each do |key, value| 
    sum = 0 
    value.each do |value1| 
    sum += value1 
    end 
    puts "#{key}: #{sum.to_f}" 
end 

Но я рекомендую вам сделать someth о себе:

class_grades.each do |key, value| 
    puts "#{key}: #{value.inject(:+).to_f}" 
end 
+0

Благодарим за быстрый и надежный ответ! – Syildiz

+0

@Syildiz Добро пожаловать) Вы можете отметить один из этих ответов в качестве правильного ответа, чтобы помочь другим найти решение связанных вопросов :) –

0

Вы должны установить на ноль sum в начале вашего цикла

class_grades.each do |key, value| 
    sum = 0 
    value.each do |value1| 
    sum += value1 
    end 
    puts "#{key}: #{sum.to_f}" 
end 

Существует более идиоматический способ получить сумму из перечислимого

class_grades.each do |key, value| 
    sum = value.inject(0, :+) 
    puts "#{key}: #{sum.to_f}" 
end 

И вам это не нужно .to_f. 1 + 2.5 получает 3.5

class_grades.each do |key, value| 
    sum = value.inject(0, :+) 
    puts "#{key}: #{sum}" 
end 
+0

Благодарим за быстрый и надежный ответ! – Syildiz

+0

Что будет результатом '[88, 74, 64, 0.34] .inject (: +)'? :) –

+0

Вы правы. Я обновил код :) – Ursus

0

Вот еще один способ сделать это:

class_grades.map { |k,v| [k, v.sum.fdiv(v.size).round(1)] }.to_h 
#=> { :section_one => 75.3, :section_two => 99.5 } 

Основные методы: Array#sum (> 2.4.0), Integer#fdiv и Float#round. См. ruby-doc.org для получения дополнительной информации.

+0

Откуда эта сумма? Я получаю сообщение об ошибке при запуске программы. – Syildiz

+0

Это новый метод [Array # sum] (http://ruby-doc.org/core-2.4.0/Array.html#method-i-sum), введенный в Ruby 2.4.0 –

+0

Я слишком новичок в узнайте, что однострочный ответ :) Спасибо за помощь! – Syildiz

 Смежные вопросы

  • Нет связанных вопросов^_^