【问题标题】:Ruby program to count the number of times the value appears among all the values in the hashRuby 程序计算该值在散列中的所有值中出现的次数
【发布时间】:2021-08-12 18:53:43
【问题描述】:

我正在尝试编写一个 ruby​​ 程序来计算该值在散列中的所有值中出现的次数。为此,我正在创建一个方法 -

count_value(哈希值)

def count_value(hash, value)
    Hash[hash.group_by { |k, value| value }.map { |k, value| [k, value.count] }]
end

puts count_value(hash, 2)

但是,我没有得到实际结果。我想要这种格式的结果:-

count_value(hash, 2) => 1
count_value(hash, 3) => 1
count_value(hash, 5) => 2
count_value(hash, 10) => 0

如何做到这一点?我在代码sn-p中犯了什么错误?

【问题讨论】:

  • 您的方法采用hash 参数。但是你通过在方法的第一行重新分配它来隐藏它 (hash = {a: 5, b:2, c: 3, d: 5})。
  • hash.values.count {|v| v == value}。但是,您将所有内容都称为“价值”并没有帮助。这使代码更难理解;)
  • @max - 如果我删除该哈希参数,那么我会得到这样的结果 - {5=>2, 2=>1, 3=>1} 。与测试用例不匹配。
  • 感谢@TomLord - 成功了。
  • 另外,有一个聪明的小方法可以解决这个更难的问题“建立一个出现的计数......” - ruby​​ 有一个特殊的方法叫做tally :) 你可以做到这一点:hash.values.tally。然后要达到您想要的结果,请使用hash.values.tally[value] || 0

标签: ruby hash


【解决方案1】:
h = {a: 5, b:2, c: 3, d: 5}
value_to_be_counted = 5

p h.count{|k, v| v == value_to_be_counted  }  # => 2

【讨论】:

    【解决方案2】:

    试试下面的代码:

    def get_hash_dup_count(hash_data)
        arr_elem_count = Hash.new(0)
        hash_values = hash_data.values
        puts "Hash values are : #{hash_values}"
        hash_values.each do |v|
              arr_elem_count[v] += 1
        end
        return arr_elem_count
    end
    
    def count_value(hash_data, value)
        arr_val_count = get_hash_dup_count(hash_data)
        puts arr_val_count[value]
    end
    
    hash_data = {
        "x" => 1,
        "y" => 2,
        "z" => 1,
        "k" => 0
      }
    
    count_value(hash_data, 2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多