On Mon, Jan 16, 2012 at 1:48 PM, Magnus Holm <judofyr / gmail.com> wrote:
> On Mon, Jan 16, 2012 at 17:04, Adam Prescott <adam / aprescott.com> wrote:
>> On Mon, Jan 16, 2012 at 16:00, Sigurd <cu9ypd / gmail.com> wrote:
>>
>>> [4,5,6,4,5,6,6,7].inject(Hash.new(0)) {|res, x| res[x] +=3D 1; res }
>>>
>>
>> I think this is a misuse of inject, personally, every time I see it. It'=
s
>> harder to read and it doesn't give the feeling of actually "reducing"
>> (inject's alias) the array down to one thing. The required `; res` is a
>> sign of that. Compare:
>>
>> [1, 2, 3, 4].inject(5) { |a, b| a + b }
>
> There's always each_with_object, although it's a little long:
>
> =A0[4,5,6,4,5,6,6,7].each_with_object(Hash.new(0)) { |x, res| res[x] +=3D=
 1 }
>

I think Magnus Holm is the clearest (IMHO, yes, it's just a taste and
humble opinion.).

[4,5,6,4,5,6,6,7].each_with_object(Hash.new(0)) {|num, hsh| hsh[num] +=3D 1=
}

Another way (not better) I remember is...

Hash[ [4,5,6,4,5,6,6,7].sort.chunk {|n| n}.map {|ix, els| [ix, els.size] } =
]

See: http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-chunk

It also can be... clearer?!?

Hash[ [4,5,6,4,5,6,6,7].group_by {|n| n}.map {|ix, els| [ix, els.size] } ]

Perhaps something like this (same as Magnus Holm) just hiding the
complexity into the method.

class Array
  def totalize_to_hash
    hsh =3D Hash.new(0)
    self.each do |n|
      hsh[n] +=3D 1
    end
    hsh
  end
end

[4,5,6,4,5,6,6,7].totalize_to_hash

Abinoam Jr.