将值转换为所有值之和的百分比

时间:2014-07-07 03:24:48

标签: ruby hash

假设我有以下代码。是否有任何代码可以将值转换为所有值之和的百分比。例如,由于所有点的总和为200,Harrison将为0.4(40%)

kids_points {
Harrison: 80,
Jack: 70, 
Justin: 30, 
Max: 20, 
}

2 个答案:

答案 0 :(得分:0)

这是一种方式:

kids_points = {
Harrison: 80,
Jack: 70, 
Justin: 30, 
Max: 20, 
}

def calculate_average(hash = arg.dup)
  sum_of_values = calculate_sum(hash.values)
  hash.each { |k,v| hash[k] = (100 * v) / sum_of_values }
end

def calculate_sum(enum)
  enum.reduce(:+).to_f
end

calculate_average(kids_points) 
# => {:Harrison=>40.0, :Jack=>35.0, :Justin=>15.0, :Max=>10.0}

阅读此Enumerable#reduceHash#values方法。

答案 1 :(得分:0)

如果您使用active_support,则可以执行此操作:

require 'active_support/all'

sum = hash.values.sum
hash.each { |k,v| hash[k] = (100.0 * v) / sum }

请注意,当百分比不是整数(大多数情况)或者他们不会总结100时,100.0是必要的。示例:

hash = {
  Harrison: 60,
  Jack: 60, 
  Justin: 50, 
  Max: 50
}

# With 100.0
# => {:Harrison=>27.272727272727273, :Jack=>27.272727272727273, :Justin=>22.727272727272727, :Max=>22.727272727272727}

# With 100
# => {:Harrison=>27, :Jack=>27, :Justin=>22, :Max=>22}