【问题标题】:Sum the values for all similar hash keys Ruby汇总所有相似哈希键的值 Ruby
【发布时间】:2021-12-11 23:55:47
【问题描述】:

下面是我的代码。它可以工作(是的!),但它需要 3 个循环(哎呀!)。编码仍然是新手,但我想知道是否有更高效、更干燥或更美观的方式来产生所需的结果。目标是对所有类似汽车品牌的值求和。然后我将值存储在每个 make ({"Honda" => 12400}) 的哈希值中,然后将哈希值存储在一个数组中。不确定这是否是最好的方法,但假设您希望根据品牌访问这些值。我还想避免硬编码任何东西——假设有 100 种不同的品牌。欢迎所有建议!

    cars = [
  {
    make: "Nissan",
    model: "Model",
    year: 2017,
    value: 5000
  },
  {
    make: "Toyota",
    model: "Corolla",
    year: 1997,
    value: 1000
  },
  {
    make: "Toyota",
    model: "Camry",
    year: 2006,
    value: 3500
  },
  {
  make: "Honda",
  model: "Accord",
  year: 2001,
  value: 5000
  },
  {
    make: "Toyota",
    model: "Tacoma",
    year: 2001,
    value: 2000
  },
  {
    make: "Honda",
    model: "Civic",
    year: 2001,
    value: 1200
  },
  {
    make: "Honda",
    model: "Civic",
    year: 2005,
    value: 2200
  },
  {
    make: "Honda",
    model: "Accord",
    year: 2010,
    value: 4000
  },
  {
    make: "Nissan",
    model: "Altima",
    year: 2017,
    value: 10000
  }
]

#GOAL
#Sum the values for all similar makes and store in an array with a nested hash
# sums_array = [{all_hondas: total_sum}, {all_toyotas: total_sum}]

total_value = 0
car_makes = []
cars.each{|car|
  #creates a hash with a car's make as the key and 0 as the value
  car_hash = {car[:make] => total_value}
  #shovels car_hash into an array if it does not already exist within the array
  unless car_makes.include? car_hash
    car_makes << car_hash
  end
}

values_array = []
car_makes.each {|make|
  make.each {|k, v|
    cars.each{|car|
      if car[:make] == k
        v += car[:value]
      end
    }
    values_array << {k => v}
  }
}

p values_array 

#values_array = [{"Nissan"=>15000}, {"Toyota"=>6500},{"Honda"=>12400}]

【问题讨论】:

  • 目前尚不清楚为什么您不能迭代数组并在单个循环中使用正在运行的 total 值递增由 make 键入的哈希值。
  • 是什么让制作“相似”? IE。您如何确定两个哈希键是否“相似”?
  • @JörgWMittag 我想更好的措辞是“如果它们相同”。 make => "honda" 与 make => "honda" 相同,但与 make => "nissan" 不同。这有意义吗?
  • 为什么你想要一个哈希数组而不是所有品牌和总数的哈希?如果您需要查找一个,您是否要遍历数组以查找具有正确哈希键的数组?这违背了使用哈希的目的,不是吗?
  • @DaveNewton 我不确定我是否遵循。也许我可以而且我没想过这样做?同样,编码相对较新,所以我很有可能把事情复杂化了。

标签: arrays ruby loops hash


【解决方案1】:

或者在一次迭代中:

cars.each_with_object(Hash.new(0)) { |car, hash| hash[car[:make]] += car[:value] }
#=> {"Nissan"=>15000, "Toyota"=>6500, "Honda"=>12400}

关于Enumerable#each_with_objectHash#new with a default 的文档

【讨论】:

  • @CarySwoveland 我输入了同样的评论!!
  • @CarySwoveland 谢谢,我更新了我的答案。 injecteach_with_object 的块参数顺序不同,这不是很有趣吗?这太令人困惑了。
猜你喜欢
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 2011-06-30
  • 2011-04-15
  • 2013-03-29
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多