# Quick way for total count of a Hash object or a Tally class

for the hash

[“apple” => 3, “banana” => 2]

is there an instant way to tally up all the counts? (instead of looping
through all keys and add up all counts, because the hash can be very
big, like thousands of items, and looping can be quite expensive for CPU
time)

does the following look right?

class Tally < Hash

def initialize
@total = 0
super(0)
end

def []=(key, new_value)
@total -= self[key] # previous value goes
@total += new_value # new value in

super
end

def inspect
super + " total = #{@total}"
end

end

t = Tally.new

t[“apple”] += 1

puts; p t

t[“banana”] += 1

puts; p t

t[“banana”] = 1000

puts; p t

t[“apple”] += 10

puts; p t

t[“apple”] -= 5

puts; p t

t[“apple”] = 10000

puts; p t

t[123] = 10

puts; p t

[~/depot] 360 \$ ruby test_tally.rb

{“apple”=>1} total = 1

{“apple”=>1, “banana”=>1} total = 2

{“apple”=>1, “banana”=>1000} total = 1001

{“apple”=>11, “banana”=>1000} total = 1011

{“apple”=>6, “banana”=>1000} total = 1006

{“apple”=>10000, “banana”=>1000} total = 11000

{“apple”=>10000, 123=>10, “banana”=>1000} total = 11010

On 9/23/07, SpringFlowers AutumnMoon [email protected] wrote:

@total -= self[key] # previous value goes
Nope RHS can be nil
@total += new_value # new value in

super
I would put super first just in case it crashes anyway

``````  old_value = fetch(key,0)
begin
super
@total += new_value - old_value
rescue
``````

HTH
Robert

Robert D. wrote:

On 9/23/07, SpringFlowers AutumnMoon [email protected] wrote:

@total -= self[key] # previous value goes
Nope RHS can be nil

coz i created the Hash to default value to 0, by super(0)

@total += new_value # new value in

super
I would put super first just in case it crashes anyway

``````  old_value = fetch(key,0)
begin
super
@total += new_value - old_value
rescue
``````

why would it crash? no key error? i thought Ruby won’t have a no key
error.