I found two ways to do this. Is one of them better? Is there a better
way?
arr = %w{a b b c c d e e e}
p arr
p arr.uniq.map {|e| [e, (arr.select {|ee| ee == e}).size ]}
counter = {}
arr.each {|e| counter[e] += 1 rescue counter[e] = 1 }
p counter.to_a
outputs:
["a", "b", "b", "c", "c", "d", "e", "e", "e"]
[["a", 1], ["b", 2], ["c", 2], ["d", 1], ["e", 3]]
[["a", 1], ["b", 2], ["c", 2], ["d", 1], ["e", 3]]
#counter = {}
#arr.each {|e| counter[e] += 1 rescue counter[e] = 1 }
#p counter.to_a
me, like the above but w slight modif below:
irb(main):013:0> counter2 = Hash.new(0)
=> {}
irb(main):014:0> arr.each {|e| counter2[e] += 1 }
=> ["a", "b", "b", "c", "c", "d", "e", "e", "e"]
irb(main):015:0> counter2.to_a
=> [["a", 1], ["b", 2], ["c", 2], ["d", 1], ["e", 3]]
irb(main):016:0>
(note the plain counter and the hash param)
hth.
kind regards -botp
I like #inject 1-liners:
>> arr = %w{a b b c c d e e e}
=> ["a", "b", "b", "c", "c", "d", "e", "e", "e"]
>> arr.inject(Hash.new(0)) {|h,x| h[x]+=1;h}
=> {"a"=>1, "b"=>2, "c"=>2, "d"=>1, "e"=>3}
>> arr.inject(Hash.new(0)) {|h,x| h[x]+=1;h}.to_a
=> [["a", 1], ["b", 2], ["c", 2], ["d", 1], ["e", 3]]
>> arr.inject(Hash.new(0)) {|h,x| h[x]+=1;h}.sort
=> [["a", 1], ["b", 2], ["c", 2], ["d", 1], ["e", 3]]
:-)
Kind regards
robert