See More

class Multiset extends java.util.TreeMap{ public Multiset(){ super(); } public Multiset(java.util.List list){ super(); for(T e: list) this.addOne(e); } public long count(Object elm){ return getOrDefault(elm,0L); } public void add(T elm, long amount){ if(!this.containsKey(elm)) put(elm, amount); else replace(elm, get(elm)+amount); if(this.count(elm)==0) this.remove(elm); } public void addOne(T elm){ this.add(elm, 1); } public void removeOne(T elm){ this.add(elm, -1); } public void removeAll(T elm){ this.add(elm, -this.count(elm)); } public static Multiset merge(Multiset a, Multiset b){ Multiset c = new Multiset<>(); for(T x: a.keySet()) c.add(x, a.count(x)); for(T y: b.keySet()) c.add(y, b.count(y)); return c; } }