为了帮助您计算可以用作哈希的不同项目。哈希类似于数组,但使用字符串而不是整数作为索引:
a = Array.new
a[0] = "this"
a[1] = "that"
h = Hash.new
h["sonja"] = "asecret"
h["brad"] = "beer"
在此示例中,哈希可能用于存储用户的密码。但是对于您的示例,您需要一个哈希来计数。调用grocery_list("eggs", "beer", "milk", "eggs") 应该会导致执行以下命令:
h = Hash.new(0) # empty hash {} created, 0 will be default value
h["eggs"] += 1 # h is now {"eggs"=>1}
h["beer"] += 1 # {"eggs"=>1, "beer"=>1}
h["milk"] += 1 # {"eggs"=>1, "beer"=>1, "milk"=>1}
h["eggs"] += 1 # {"eggs"=>2, "beer"=>1, "milk"=>1}
您可以使用每个循环处理 Hash 的所有键和值:
h.each{|key, value| .... }
并构建我们需要的字符串,如果需要,添加项目的数量,以及项目的名称。在循环中,我们总是在末尾添加一个逗号和一个空格。最后一个元素不需要这个,所以在循环完成后,我们剩下
"2 eggs, beer, milk, "
为了摆脱最后一个逗号和空格,我们可以使用chop!,它在字符串末尾“切掉”一个字符:
output.chop!.chop!
还需要做一件事来完整地实现你的grocery_list:你指定函数应该像这样调用:
puts grocery_list("eggs", "beer", "milk","eggs")
因此,grocery_list 函数不知道它得到了多少参数。我们可以通过在前面指定一个带有星号的参数来处理这个问题,然后这个参数将是一个包含所有参数的数组:
def grocery_list(*items)
# items is an array
end
所以这里是:我为你做了功课并实现了grocery_list。我希望你真的去理解实现的麻烦,不要只是复制和粘贴它。
def grocery_list(*items)
hash = Hash.new(0)
items.each {|x| hash[x] += 1}
output = ""
hash.each do |item,number|
if number > 1 then
output += "#{number} "
end
output += "#{item}, "
end
output.chop!.chop!
return output
end
puts grocery_list("eggs", "beer", "milk","eggs")
# output: 2 eggs, beer, milk