通过Ruby中的哈希增加迭代次数

时间:2014-02-05 00:15:41

标签: ruby-on-rails ruby

在Ruby中逐步迭代一对哈希的最佳方法是什么?我应该将它们转换为数组吗?我应该走一个完全不同的方向吗?我正在研究一个问题,在这个问题中,代码应该确定烘焙的内容,以及给出2个输入的面包店的数量。要喂的人数和他们最喜欢的食物。他们烘焙3件事(my_list中的键),每个烘焙的物品都会提供一定数量的人(my_list中的值)。

def bakery_num(num_of_people, fav_food)
  my_list = {"pie" => 8, "cake" => 6, "cookie" => 1}
  bake_qty = {"pie_qty" => 0, "cake_qty" => 0, "cookie_qty" => 0}

  if my_list.has_key?(fav_food) == false  
  raise ArgumentError.new("You can't make that food")
  end

  index = my_list.key_at(fav_food)
  until num_of_people == 0
    bake_qty[index] = (num_of_people / my_list[index])
    num_of_people = num_of_people - bake_qty[index]
    index += 1
  end     

  return "You need to make #{pie_qty} pie(s), #{cake_qty} cake(s), and #{cookie_qty} cookie(s)."

end

目标是输出面包店的清单,这将导致没有未吃的食物。在进行数学运算时,模数将被分成下一个食物项目。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

  

在Ruby中逐步迭代一对哈希的最佳方法是什么?

由于bake_qty的密钥可以方便地从'_qty'中的相应密钥添加my_list,因此您可以利用此功能:

max_value = my_list[fav_food]    
my_list.each do |key,value|
    next if max_value < value
    qty = bake_qty[key+'_qty']
    ...
end

答案 1 :(得分:0)

您可以使用“inject”方法。

until num_of_people == 0
    num_of_people = my_list.inject(num_of_people)  do |t,(k,v)|
        if num_of_people > 0
            bake_qty["#{key}_qty"] += num_of_people/v
            t - v
        end
end  

您可以在开始时sort your hash确保您的第一份食物是最喜欢的食物

相关问题