【问题标题】:How to print all key value pairs in Ruby hash?如何在 Ruby 哈希中打印所有键值对?
【发布时间】:2019-04-12 14:43:15
【问题描述】:

对于这个可能很愚蠢的问题,我深表歉意,我绝对是 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 个胡萝卜。”

【问题讨论】:

  • 我想,当 count 大于 1 时,您想将 'apple' 复数为 'apples'。
  • 请记住,您可以在哈希中查找内容,而无需旋转并进行比较。 if (value = hash[order]) 一口气完成所有这些。随着项目数量的增加,您在此处使用的方法会逐渐变慢。无论条目数如何,查找方法所花费的时间大致相同。
  • 这里问题的症结在于value += 1 没有更新哈希。你需要使用Hash#[]=

标签: ruby hash


【解决方案1】:
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。然后,我递增并分配回该键

【讨论】:

    【解决方案2】:

    该问题没有指定您是否要改变初始哈希,所以我想您会这样做。那么下面就可以了。

    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]
    

    【讨论】:

      【解决方案3】:

      考虑初始化哈希并提供默认值 (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
      

      在循环中捕获用户输入(在 cmets 中解释):

      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)
      

      【讨论】:

        猜你喜欢
        • 2013-09-30
        • 2015-11-15
        • 1970-01-01
        • 1970-01-01
        • 2019-02-23
        • 1970-01-01
        • 2017-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多