我很抱歉这个潜在的愚蠢问题,我是Ruby和一般代码的绝对初学者。
我已经用一些预定值设置了哈希值。我想询问用户输入,如果该输入与现有键匹配,我想要更新相应的值(在这种情况下为+ 1)。然后,我要打印所有当前的最新值。
hash = {"apple": 6, "banana": 2, "carrot": 3}
order = gets.chomp.downcase
hash.each do |key, value|
if key.to_s == order
value += 1
puts "Your order includes: #{value} #{key}."
end
end
我的问题是我只知道如何打印单个键值对。
例如如果用户输入“苹果”,我希望输出显示“您的订单包括:7个苹果,2个香蕉,3个胡萝卜”。
答案 0 :(得分:3)
hash = {apple: 6, banana: 2, carrot: 3}
order = gets.chomp.downcase.to_sym
hash[order] = hash.fetch(order, 0) + 1
puts "Your order includes: " + hash.map { |k, v| "#{v} #{k}" }.join(", ")
一些注意事项:
您的哈希初始化hash = {"apple": 6, "banana": 2, "carrot": 3}
。哈希的键似乎是字符串,但是如果在冒号中使用该语法,则它们将成为符号。因此,您有两种选择。这种语法:
hash = {"apple" => 6, "banana" => 2, "carrot" => 3}
或者您可以像我一样使用符号并将用户输入转换为符号
hash真正酷的地方在于,您无需遍历元素即可找到所需的内容。键和值之间存在映射,因此很容易找到和更新值
在第三行中,我正在处理密钥不能在哈希中的事实,在这种情况下,我使用fetch
将其设置为0。然后,我增加并分配回该键
答案 1 :(得分:1)
该问题未指定您是否要更改初始哈希,所以我想您应该这样做。然后将执行以下操作。
hash = Hash.new(0).merge(apple: 6, banana: 2, carrot: 3)
hash[gets.chomp.downcase.to_sym] += 1
puts "Your order includes: " <<
hash.map { |k, v| [v, k].join(' ') }.join(', ')
或:
puts hash.reduce("Your order includes: ") { |acc, (k, v)|
acc << "#{v} #{k}, "
}[0..-3]
答案 2 :(得分:0)
考虑初始化哈希,以提供默认值(Hash#default)
basket = {'apple' => 6, 'banana' => 2, 'carrot' => 3}
basket.default = 0 # <-- set default 0 for start counting new keys
定义一种显示数据的方法:
def show(basket)
puts "Your order includes:"
basket.each{ |key, value| puts "#{value}: #{key}" }
end
捕获用户输入的循环内容(注释中的解释):
loop do
puts "Place your order:"
order = gets.downcase.chomp # <-- format the input
break if order == '0' # <-- breaks the input loop if this contition is matched
next unless basket.has_key? order # <-- skip to next loop no matches with hash keys or remove this line if you want to count also non initialised keys
basket[order] += 1 # <-- increment by one the key
show(basket) # <-- call the metod to show the basket
end
show(basket)