package timeflow.util; import java.util.*; public class Bag<T> implements Iterable<T> { HashMap<T, Count> table; int max; public Bag() { table=new HashMap<T, Count>(); } public Bag(Iterable<T> i) { for (T x:i) add(x); } public Bag(T[] array) { for (int i=0; i<array.length; i++) add(array[i]); } public int getMax() { return max; } public List<T> listTop(int n) { int count=0; Iterator<T> i=list().iterator(); List<T> top=new ArrayList<T>(); while (count<n && i.hasNext()) { top.add(i.next()); count++; } return top; } public List<T> unordered() { List<T> result=new ArrayList<T>(); result.addAll(table.keySet()); return result; } public List<T> list() { List<T> result=new ArrayList<T>(); result.addAll(table.keySet()); Collections.sort(result, new Comparator<T>() { public int compare(T x, T y) { return num(y)-num(x); } }); return result; } public int num(T x) { Count c=table.get(x); if (c!=null) return c.num; else return 0; } public int add(T x) { Count c=table.get(x); int n=0; if (c!=null) n=++c.num; else { table.put(x, new Count(1)); n=1; } max=Math.max(n,max); return n; } class Count { int num; public Count(int num) { this.num=num; } } public int size() { return table.size(); } public int removeLessThan(int cut) { Set<T> small=new HashSet<T>(); for (T x: table.keySet()) { if (num(x)<cut) small.add(x); } for (T x:small) table.remove(x); return small.size(); } public static void main(String[] args) { Bag<String> b=new Bag<String>(); b.add("a"); b.add("b"); b.add("a"); System.out.println(b.num("a")); System.out.println(b.num("b")); System.out.println(b.num("c")); List<String> s=b.list(); for (int i=0; i<s.size(); i++) System.out.println(s.get(i)+": "+b.num(s.get(i))); } @Override public Iterator<T> iterator() { return table.keySet().iterator(); } }