module Enumerable
# Returns a Hash keyed by the value of the block to the number times that
# value was returned. If you have experience with the #group_by from
# ActiveSupport, this would be like .group_by(&block).map{|k,a|[k,a.size]}
# (except it is a Hash rather than an Array).
def count_by
counts = Hash.new(0)
each {|e| counts[block_given? ? yield(e) : e] += 1}
counts
end
end
$ irb -r ./enumerable
irb1.9.3> a=[ 'casual','sick','casual','sick','casual','sick','casual','sick' ]
#1.9.3 => ["casual", "sick", "casual", "sick", "casual", "sick", "casual", "sick"]
irb1.9.3> a.count_by
#1.9.3 => {"casual"=>4, "sick"=>4}
This keeps you from iterating over the source multiple times, too.
-Rob