package quickml.collections; import java.io.Serializable; import java.util.*; /** * Created by ian on 3/2/14. */ public class ValueSummingMap<K> implements Map<K, Number>, Serializable { private static final long serialVersionUID = 582080010331916162L; private volatile double sumOfValues = 0; private HashMap<K, Number> delegateMap = new HashMap<K, Number>(); @Override public int size() { return delegateMap.size(); } public double getSumOfValues() { return sumOfValues; } @Override public boolean isEmpty() { return delegateMap.isEmpty(); } @Override public boolean containsKey(final Object key) { return delegateMap.containsKey(key); } @Override public boolean containsValue(final Object value) { return delegateMap.containsValue(value); } @Override public Number get(final Object key) { return delegateMap.get(key); } @Override public Number put(final K key, final Number value) { Number oldValue = delegateMap.put(key, value); if (oldValue != null) { sumOfValues = (sumOfValues - oldValue.doubleValue()) + value.doubleValue(); } else { sumOfValues += value.doubleValue(); } return oldValue; } public void addToValue(final K key, final double toAdd) { Number oldValue = get(key); if (oldValue == null) { oldValue = new Double(0.0); } delegateMap.put(key, oldValue.doubleValue() + toAdd); sumOfValues += toAdd; } @Override public Number remove(final Object key) { Number removedValue = delegateMap.remove(key); if (removedValue != null) { sumOfValues -= removedValue.doubleValue(); } return removedValue; } @Override public void putAll(final Map<? extends K, ? extends Number> m) { for (Entry<? extends K, ? extends Number> entry : m.entrySet()) { this.put(entry.getKey(), entry.getValue()); } } @Override public void clear() { sumOfValues = 0; delegateMap.clear(); } @Override public Set<K> keySet() { return delegateMap.keySet(); } @Override public Collection<Number> values() { return delegateMap.values(); } @Override public Set<Entry<K, Number>> entrySet() { return delegateMap.entrySet(); } }