【发布时间】: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 我不确定我是否遵循。也许我可以而且我没想过这样做?同样,编码相对较新,所以我很有可能把事情复杂化了。