Create hash from array and frequency

前端 未结 8 1521
盖世英雄少女心
盖世英雄少女心 2021-02-05 21:23

I have an array [1,2,4,5,4,7] and I want to find the frequency of each number and store it in a hash. I have this code, but it returns NoMethodError: undefine

相关标签:
8条回答
  • 2021-02-05 22:09

    Do as below :

    def score( array )
      hash = Hash.new(0)
      array.each{|key| hash[key] += 1}
      hash
    end
    score([1,2,4,5,4,7]) # => {1=>1, 2=>1, 4=>2, 5=>1, 7=>1}
    

    Or more Rubyish using Enumerable#each_with_object:

    def score( array )
      array.each_with_object(Hash.new(0)){|key,hash| hash[key] += 1}
    end
    score([1,2,4,5,4,7]) # => {1=>1, 2=>1, 4=>2, 5=>1, 7=>1}
    

    The reason of why NoMethodError: undefined method '+' for nil:NilClass ?

    hash = {} is an empty has,with default value as nil.nil is an instance of Nilclass,and NilClass doesn't have any instance method called #+. So you got NoMethodError.

    Look at the Hash::new documentation :

    new → new_hash
    new(obj) → new_hash
    

    Returns a new, empty hash. If this hash is subsequently accessed by a key that doesn’t correspond to a hash entry, the value returned depends on the style of new used to create the hash. In the first form, the access returns nil. If obj is specified, this single object will be used for all default values. If a block is specified, it will be called with the hash object and the key, and should return the default value. It is the block’s responsibility to store the value in the hash if required.

    0 讨论(0)
  • 2021-02-05 22:12

    In Ruby 2.4+:

    def score(array)
      array.group_by(&:itself).transform_values!(&:size)
    end
    
    0 讨论(0)
提交回复
热议问题