Home > Software design >  How to print only the keys which have values? - [RUBY]
How to print only the keys which have values? - [RUBY]

Time:12-27

I have a hash map with keys and values as follows : -

hash = {lili => [] , john => [a, b], andrew => [], megh =>[b,e]}

As we can see some of the keys have values as empty arrays.

Some keys have values arrays where there are actual values in the array.

I want to loop over the hash map and print those keys which have values in arrays only (not the ones which have empty arrays). How can I do that?

Are empty arrays [] also considered as a value for the keys in hash map?

CodePudding user response:

Unsure of your desired output or exact data structure, but you can simply use reject along with empty? to remove any hash value that contains an empty array:

hash = {"lili" => [] , "john" => ["a", "b"], "andrew" => [], "megh" => ["b","e"]}

hash.reject {|k, v| v.empty?}
#=>  {"john"=>["a", "b"], "megh"=>["b", "e"]}

It should however be noted that this approach will not work if any hash values are nil. To address that situation, I would recommend either using compact to remove any hash elements with nil values prior to using reject OR by testing for either nil? or empty? (and in that order):

hash = {"lili" => [] , "john" => ["a", "b"], "andrew" => [], "megh" => ["b","e"], "other" => nil}

hash.reject {|k, v| v.empty?}
#=>  Evaluation Error: Ruby NoMethodError: undefined method `empty?' for nil:NilClass
hash.compact.reject {|k, v| v.empty?}
#=>  {"john"=>["a", "b"], "megh"=>["b", "e"]}

hash.reject {|k, v| v.empty? or v.nil?}
#=>  Evaluation Error: Ruby NoMethodError: undefined method `empty?' for nil:NilClass    
hash.reject {|k, v| v.nil? or v.empty?}
#=>  {"john"=>["a", "b"], "megh"=>["b", "e"]}


hash.reject {|k, v| v.empty? || v.nil?}
#=>  Evaluation Error: Ruby NoMethodError: undefined method `empty?' for nil:NilClass    
hash.reject {|k, v| v.nil? || v.empty?}
#=>  {"john"=>["a", "b"], "megh"=>["b", "e"]}

CodePudding user response:

You could use reject to filter out those elements in your hash where the value is an empty array or the value is nil and then iterate to print their content;

{:lili=>[], :john=>[:a, :b], :andrew=>[], :megh=>[:b, :e], :other=>nil}
  .reject { (_2 || []).empty? }
  .each { puts "#{_1} has the value(s) #{_2}" }

that prints

john has the value(s) [:a, :b]
megh has the value(s) [:b, :e]
  • Related