CommonsCollections学习笔记(一)

public interface Bag extends Collection{   int getCount(Object object);   boolean add(Object object);   boolean add(Object object, int nCopies);   boolean remove(Object object);   boolean remove(Object object, int nCopies);   Set uniqueSet();   int size();   boolean containsAll(Collection coll);   boolean removeAll(Collection coll);   boolean retainAll(Collection coll);   IteraTor iteraTor();}public interface SortedBag extends Bag{   public ComparaTor comparaTor();   public Object first();   public Object last();}public abstract class DefaultMapBag implements Bag{   private Map _map = null;//底层数据存储区   private int _total = 0; //元素总个数   private int _mods = 0;//修改次数   public DefaultMapBag() {   }   protected DefaultMapBag(Map map) {     setMap(map);   }   public boolean add(Object object) {     return add(object, 1);   }   public boolean add(Object object, int nCopies) {     _mods++;     if (nCopies > 0) {       int count = (nCopies + getCount(object));       _map.put(object, new Integer(count));       _total += nCopies;       return (count == nCopies);     } else {       return false;     }   }   public boolean addAll(Collection coll) {     boolean changed = false;     IteraTor i = coll.iteraTor();     while (i.hasNext()) {       boolean added = add(i.next());       changed = changed || added;     }     return changed;   }   public void clear() {     _mods++;     _map.clear();     _total = 0;   }   public boolean contains(Object object) {     return _map.containsKey(object);   }   public boolean containsAll(Collection coll) {     return containsAll(new HashBag(coll));   }   public boolean containsAll(Bag other) {     boolean result = true;     IteraTor i = other.uniqueSet().iteraTor();     while (i.hasNext()) {       Object current = i.next();       boolean contains = getCount(current) >= other.getCount(current);       result = result && contains;     }     return result;   }   public boolean equals(Object object) {     if (object == this) {       return true;     }     if (object instanceof Bag == false) {       return false;     }     Bag ther = (Bag) object;     if (other.size() != size()) {       return false;     }     for (IteraTor it = _map.keySet().iteraTor(); it.hasNext();) {       Object element = it.next();       if (other.getCount(element) != getCount(element)) {         return false;       }     }     return true;   }   public int hashCode() {     return _map.hashCode();   }   public boolean isEmpty() {     return _map.isEmpty();   }   public IteraTor iteraTor() {     return new BagIteraTor(this, extractList().iteraTor());   }   static class BagIteraTor implements IteraTor {     private DefaultMapBag _parent = null;     private IteraTor _support = null;//原始迭代器     private Object _current = null;//当前元素     private int _mods = 0;     public BagIteraTor(DefaultMapBag parent, IteraTor support) {       _parent = parent;       _support = support;       _current = null;       _mods = parent.modCount();     }     public boolean hasNext() {       return _support.hasNext();     }     public Object next() {       if (_parent.modCount() != _mods) {         throw new ConcurrentModificationException();       }       _current = _support.next();       return _current;     }     public void remove() {       if (_parent.modCount() != _mods) {         throw new ConcurrentModificationException();       }       _support.remove();       _parent.remove(_current, 1);       _mods++;     }   }   public boolean remove(Object object) {     return remove(object, getCount(object));   }   public boolean remove(Object object, int nCopies) {     _mods++;     boolean result = false;     int count = getCount(object);     if (nCopies nCopies) {       _map.put(object, new Integer(count - nCopies));       result = true;       _total -= nCopies;     } else { // count > 0 && count <= i        // need to remove all       result = (_map.remove(object) != null);       _total -= count;     }     return result;   }   public boolean removeAll(Collection coll) {     boolean result = false;     if (coll != null) {       IteraTor i = coll.iteraTor();       while (i.hasNext()) {         boolean changed = remove(i.next(), 1);         result = result || changed;       }     }     return result;   }   public boolean retainAll(Collection coll) {     return retainAll(new HashBag(coll));   }   public boolean retainAll(Bag other) {     boolean result = false;     Bag excess = new HashBag();     IteraTor i = uniqueSet().iteraTor();     while (i.hasNext()) {       Object current = i.next();       int myCount = getCount(current);       int therCount = other.getCount(current);       if (1 <= otherCount && otherCount 0; index--) {         result.add(current);       }     }     return result;   }   private int modCount() {     return _mods;   }   public String toString() {     StringBuffer buf = new StringBuffer();     buf.append("[");     IteraTor i = uniqueSet().iteraTor();     while (i.hasNext()) {       Object current = i.next();       int count = getCount(current);       buf.append(count);       buf.append(":");       buf.append(current);       if (i.hasNext()) {         buf.append(",");       }     }     buf.append("]");     return buf.toString();   }}public class HashBag extends DefaultMapBag implements Bag{   public HashBag() {     super(new HashMap());   }   public HashBag(Collection coll) {     this();     addAll(coll);   }}public class TreeBag extends DefaultMapBag implements SortedBag{   public TreeBag() {     super(new TreeMap());   }   public TreeBag(ComparaTor comparaTor) {     super(new TreeMap(comparaTor));   }   public TreeBag(Collection coll) {     this();     addAll(coll);   }   public Object first() {     return ((SortedMap) getMap()).firstKey();   }   public Object last() {     return ((SortedMap) getMap()).lastKey();   }   public ComparaTor comparaTor() {     return ((SortedMap) getMap()).comparaTor();   }}

使用decorate模式的Bag工具类

public class BagUtils{   /**   * An empty unmodifiable bag.   */   public static final Bag EMPTY_BAG = UnmodifiableBag.decorate(new HashBag());   /**   * An empty unmodifiable sorted bag.   */public static final Bag EMPTY_SORTED_BAG = UnmodifiableSortedBag.decorate(new TreeBag());   public BagUtils() {//这里按常理不应该是public,应该是private才对,作者应该有其他地方要用到吧   }   public static Bag synchronizedBag(Bag bag) {     return SynchronizedBag.decorate(bag);   }   public static Bag unmodifiableBag(Bag bag) {     return UnmodifiableBag.decorate(bag);   }   public static Bag predicatedBag(Bag bag, Predicate predicate) {     return PredicatedBag.decorate(bag, predicate);   }   public static Bag typedBag(Bag bag, Class type) {     return TypedBag.decorate(bag, type);   }   public static Bag transformedBag(Bag bag, Transformer transformer) {     return TransformedBag.decorate(bag, transformer);   }   public static SortedBag synchronizedSortedBag(SortedBag bag) {     return SynchronizedSortedBag.decorate(bag);   }   public static SortedBag unmodifiableSortedBag(SortedBag bag) {     return UnmodifiableSortedBag.decorate(bag);   }   public static SortedBag predicatedSortedBag(SortedBag bag, Predicate predicate) {     return PredicatedSortedBag.decorate(bag, predicate);   }   public static SortedBag typedSortedBag(SortedBag bag, Class type) {     return TypedSortedBag.decorate(bag, type);   }   public static SortedBag transformedSortedBag(SortedBag bag, Transformer transformer) {     return TransformedSortedBag.decorate(bag, transformer);   }}

每个人都有自己鲜明的主张和个性,

CommonsCollections学习笔记(一)

相关文章:

你感兴趣的文章:

标签云: