// Copyright 2013 Thomas Müller // This file is part of MarMoT, which is licensed under GPLv3. package marmot.util; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; public class Counter<T> implements Serializable { private static final long serialVersionUID = 1L; private Map<T, Double> storage_; private Double total_count_; private Double default_value_; public Set<Entry<T, Double>> entrySet() { return storage_.entrySet(); } public Counter(Double defaultValue, int initialCapacity) { storage_ = new HashMap<T, Double>(initialCapacity); this.default_value_ = defaultValue; total_count_ = 0.; } public Counter(Double defaultValue) { this(defaultValue, 10); } public Counter() { this(0.); } public void set(T item, Double freq) { if (freq != default_value_) { storage_.put(item, freq); } else { storage_.remove(item); } } public void increment(T item, Double freq) { if (!storage_.containsKey(item)) { storage_.put(item, freq + default_value_); } else { storage_.put(item, freq + storage_.get(item)); } Double newFreq = storage_.get(item); if (newFreq == default_value_) { storage_.remove(item); } total_count_ += freq; } public Double count(T item) { if (!storage_.containsKey(item)) { return default_value_; } else { return storage_.get(item); } } public Double totalCount() { return total_count_; } public int size() { return storage_.size(); } public String toString() { return storage_.toString(); } public Collection<Double> counts() { return storage_.values(); } public void clear() { storage_.clear(); } public Set<T> keySet() { return storage_.keySet(); } public List<Entry<T, Double>> sortedEntries() { List<Entry<T, Double>> list = new ArrayList<Entry<T, Double>>( storage_.entrySet()); Collections.sort(list, new Comparator<Entry<T, Double>>() { @Override public int compare(Entry<T, Double> o1, Entry<T, Double> o2) { return -Double.compare(o1.getValue(), o2.getValue()); } }); return list; } public List<Entry<T, Double>> sortedEntries(int length) { List<Entry<T, Double>> list = sortedEntries(); if (list.size() > length) { list = list.subList(0, length); } return list; } public T max() { Map.Entry<T, Double> max_entry = null; for (Map.Entry<T, Double> entry : storage_.entrySet()) { if (max_entry == null || max_entry.getValue() < entry.getValue()) { max_entry = entry; } } return max_entry.getKey(); } }