汇总所有相似哈希键的值 Ruby

Posted

技术标签:

【中文标题】汇总所有相似哈希键的值 Ruby【英文标题】:Sum the values for all similar hash keys 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 我不确定我是否遵循。也许我可以而且我没想过这样做?同样,编码相对较新,所以我很有可能把事情复杂化了。 【参考方案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 的块参数顺序不同,这不是很有趣吗?这太令人困惑了。

以上是关于汇总所有相似哈希键的值 Ruby的主要内容,如果未能解决你的问题,请参考以下文章

相似图片搜索:感知哈希算法

雷林鹏分享:Ruby 哈希(Hash)

如何捕获相似基因(两个相似哈希算法分析)

minHash最小哈希原理

在 Ruby 中更新哈希键的惯用方法是啥?

如何从海量数据中找到相似数据--那些用于查找相似数据的哈希算法