【问题标题】:To sum up more than one array values in hash - Ruby在哈希中总结多个数组值 - Ruby
【发布时间】:2016-12-29 11:56:59
【问题描述】:

我有一个哈希示例,它在 Ruby 中有两个元素(section_one 和 section_two)。我想分别总结每个元素并估计每个元素的平均值。

我的哈希:

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

我在单独总结每个元素时遇到了问题。它估计第一个元素并继续。你能帮我解决这个问题吗?

【问题讨论】:

    标签: arrays ruby hash sum average


    【解决方案1】:

    首先,对您的代码进行最少的编辑:

    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|
      puts "#{key}: #{value.inject(:+).to_f}"
    end
    

    【讨论】:

    • 感谢您快速可靠的回答!
    • @Syildiz 不客气)您可以将这些答案之一标记为正确答案,以帮助其他人找到相关问题的解决方案:)
    【解决方案2】:

    您应该在循环开始时将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_f1 + 2.5 得到3.5

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

    【讨论】:

    • 感谢您快速可靠的回答!
    • [88, 74, 64, 0.34].inject(:+) 的结果是什么? :)
    • 建议:在数组为空的情况下使用inject(0,:+)
    【解决方案3】:

    这是另一种方法:

    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#fdivFloat#round。请参阅ruby-doc.org 了解更多信息。

    【讨论】:

    • 这笔钱是从哪里来的?运行时出现错误。
    • 这是 Ruby 2.4.0 中引入的新方法Array#sum
    • 我太新手了,找不到那个单行答案:) 谢谢你的帮助!
    • @Syildiz 是的,如果您刚刚开始,这可能会相当复杂。我只是在展示另一种做事方式。祝你学习 Ruby 好运。
    猜你喜欢
    • 2020-10-09
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2016-03-07
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    相关资源
    最近更新 更多