-2

Write a method, which given an array, returns a hash whose keys are words in the array and whose values are the number of times each word appears.

arr=["A", "man", "a", "plan", "a", "canal","Panama"]
# => {'a' => 3, 'man' => 1, 'canal' => 1, 'panama' => 1, 'plan' => 1}

How do I achieve that? Here's my code:

hash={}
arr.each do |i|
    hash.each do |c,v|
       hash[c]=v+1
    end
end       
Andrew Marshall
  • 95,083
  • 20
  • 220
  • 214
OneMoreError
  • 7,518
  • 20
  • 73
  • 112

3 Answers3

3
hash = arr.inject({}) do |hash, element| 
  element.downcase!
  hash[element] ||= 0
  hash[element] += 1
  hash
end
Brendan Benson
  • 763
  • 5
  • 9
3
arr.inject­(Hash.new(­0)){|h,k| k.dow­ncase!; h[k] += 1; h}
Sklivvz
  • 30,601
  • 24
  • 116
  • 172
xdazz
  • 158,678
  • 38
  • 247
  • 274
0
arr = ["A", "man", "a", "plan", "a", "canal","Panama"]
r = {}
arr.each { |e| e.downcase!; r[e] = arr.count(e) if r[e].nil? }

Output

p r
#==> {"a"=>3, "man"=>1, "plan"=>1, "canal"=>1, "panama"=>1}
thebugfinder
  • 324
  • 1
  • 9