quick way for total count of a Hash object or a Tally class

  • Thread starter SpringFlowers AutumnMoon
  • Start date
S

SpringFlowers AutumnMoon

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

attr_reader :total

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
 
R

Robert Dober

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

attr_reader :total

def initialize
@total = 0
super(0)
end

def []=(key, new_value)
@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
 
S

SpringFlowers AutumnMoon

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

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

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,968
Messages
2,570,150
Members
46,697
Latest member
AugustNabo

Latest Threads

Top