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

问题描述 投票:0回答:4

我为这个潜在的愚蠢问题道歉,我是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

我的问题是我只知道如何打印单个键值对。

例如。如果用户输入“apple”,我想输出说“你的订单包括:7个苹果,2个香蕉,3个胡萝卜”。

ruby hash
4个回答
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} 或者你可以像我一样使用符号并转换符号中的用户输入
  • 哈希的真正酷处在于你不需要迭代元素来找到你想要的东西。键和值之间存在映射,因此可以轻松查找和更新值
  • 在第三行,我正在处理密钥不能在哈希中的事实,我在这种情况下使用fetch得到0。然后,我增加并分配回那个键

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]

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)
© www.soinside.com 2019 - 2024. All rights reserved.