Question

I have a hash where the values are all arrays. I want to look up a key in this hash. If it exists I want to add a value to the array. If it does not exist (hash[key] returns nil) then I need to create the array and and add one value. Currently I have this:

hash[key].push elem unless hash[key].nul?
hash[key] ||= [elem]

This involves 3 lookups. I'm new to ruby so I'm sure there's a better way to do this. What is it?

My original plan was to make the default value for the hash [ ]. Then I can just use:

hash[key].push elem

Unfortunately if the key does not exist, that will only change the default value and not add a new key.

Was it helpful?

Solution 2

You can try:

(hash[key] ||= []) << elem

However Arup's answer is much better.

OTHER TIPS

In this case you need to create a hash as below :

hash = Hash.new { |h,k| h[k] = [] }

The above is created to handle situations like your. Look new {|hash, key| block } → new_hash

hash = Hash.new { |h,k| h[k] = [] }

hash[:key1] << 1
hash[:key2] << 2
hash[:key1] << 3

hash # => {:key1=>[1, 3], :key2=>[2]}

You should create your hash with a default value.

hash = Hash.new { |h,k| h[k] = [] }
hash[key].push elem
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top