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
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
···
On 9/23/07, SpringFlowers AutumnMoon <summercoolness@gmail.com> wrote:
--
I'm an atheist and that's it. I believe there's nothing we can know
except that we should be kind to each other and do what we can for
other people.
-- Katharine Hepburn