# assert c.max == "b" # because "b" has the most count (3)
# assert c.avg == 2.0 # because it is the mean of the counts
# ~~~~
-class Counter[E: Object]
+class Counter[E]
super Map[E, Int]
# Total number of counted occurrences
redef fun iterator do return map.iterator
# The number of counted occurrences of `e`
- redef fun [](e: E): Int
+ redef fun [](e)
do
var map = self.map
if map.has_key(e) then return map[e]
return 0
end
- redef fun []=(e: E, value: Int)
+ redef fun []=(e, value)
do
sum -= self[e]
self.map[e] = value
for e in es do inc(e)
end
+ # Decrement the value of `e` by 1
+ fun dec(e: E) do
+ if not has_key(e) then
+ self.map[e] = 0
+ else
+ self.map[e] = self[e] - 1
+ sum += - 1
+ end
+ end
+
+ # Decrement the value for each element of `es`
+ fun dec_all(es: Collection[E])
+ do
+ for e in es do dec(e)
+ end
+
# A new Counter initialized with `inc_all`.
init from(es: Collection[E])
do
fun max: nullable E do
var max: nullable Int = null
var elem: nullable E = null
- for e, v in map do
+ for e in map.keys do
+ var v = map[e]
if max == null or v > max then
max = v
elem = e
fun min: nullable E do
var min: nullable Int = null
var elem: nullable E = null
- for e, v in map do
+ for e in map.keys do
+ var v = map[e]
if min == null or v < min then
min = v
elem = e
end
end
-private class CounterComparator[E: Object]
+private class CounterComparator[E]
super Comparator
redef type COMPARED: E
var counter: Counter[E]