如何在Ruby哈希中打印所有键值对?

时间:2019-04-12 14:43:16

标签: ruby hash

我很抱歉这个潜在的愚蠢问题,我是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个胡萝卜”。

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)