【问题标题】:summing values in a hash对哈希值求和
【发布时间】:2013-01-30 17:08:44
【问题描述】:

在 ruby​​ 中求和哈希值的最佳方法是什么:

@price = { :price1 => "100", :price2 => "100", :price3 => "50" }

我现在正在做这样的事情:

@pricepackage = @price[:price1] + @price[:price2] + @price[:price3] + 500

请解释您的答案,我想了解原因,而不仅仅是如何。 =)

【问题讨论】:

  • 那些右括号是什么?您的 Ruby 代码无效。

标签: ruby hashmap


【解决方案1】:

你可以这样做:

@price.values.map(&:to_i).inject(0, &:+)

编辑:添加解释

所以@price.values 返回一个数组,该数组收集散列的所有值。例如["1", "12", "4"]。然后.map(&:to_i)to_i 应用于该数组的每个元素,因此您得到[1,12,4]。最后.inject(0,&:+) preforms 注入初始值为 0 并使用函数+ 进行累加,因此它在最后一步中对数组的所有元素求和。

【讨论】:

  • 请解释你的答案 =)
  • 它是元编程,是 ruby​​ 最独特和最棒的功能之一:P (youtube.com/watch?v=kNpcaaL_dZA)
  • @Ivaylo Strandjev 谢谢 =) 我很快就会接受你的回答。
  • @Ivaylo Strandjev,如果我想为总和添加另一个整数值,只需执行以下操作即可:@price.values.map(&:to_i).inject(0 , &:+) + 500
  • inject(0, &:+) 可以简化为inject(&:+)。当您不提供初始值时,inject 将使用枚举的第一个值作为初始值。
【解决方案2】:

如果您的数据集如下所示:

prices = {price1: 100, price2: 100, price3: 50}

那么这将对值求和:

prices.values.inject(0) {|total, v| total += v}

【讨论】:

  • 或者只是prices.values.inject(:+)
【解决方案3】:

保持简单

@prices = ....
@price = 0.0

@prices.each do |p|
   @price += p
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2013-10-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    相关资源
    最近更新 更多