Commons Collections学习笔记(一)

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 other 
=  (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  <=   0 ) {
            result 
=   false ;
        } 
else   if  (count  >  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  otherCount  =  other.getCount(current);
            
if  ( 1   <=  otherCount  &&  otherCount  <=  myCount) {
                excess.add(current, myCount 
-  otherCount);
            } 
else  {
                excess.add(current, myCount);
            }
        }
        
if  ( ! excess.isEmpty()) {
            result 
=  removeAll(excess);
        }
        
return  result;
    }
    
public  Object[] toArray() {
        
return  extractList().toArray();
    }
    
public  Object[] toArray(Object[] array) {
        
return  extractList().toArray(array);
    }
    
public   int  getCount(Object object) {
        
int  result  =   0 ;
        Integer count 
=  MapUtils.getInteger(_map, object);
        
if  (count  !=   null ) {
            result 
=  count.intValue();
        }
        
return  result;
    }
    
public  Set uniqueSet() {
        
return  UnmodifiableSet.decorate(_map.keySet());
    }
    
public   int  size() {
        
return  _total;
    }
    
protected   int  calcTotalSize() {
        _total 
=  extractList().size();
        
return  _total;
    }
    
protected   void  setMap(Map map) {
        
if  (map  ==   null   ||  map.isEmpty()  ==   false ) {
            
throw   new  IllegalArgumentException( " The map must be non-null and empty " );
        }
        _map 
=  map;
    }
    
protected  Map getMap() {
        
return  _map;
    }
    
private  List extractList() {
        List result 
=   new  ArrayList();
        Iterator i 
=  uniqueSet().iterator();
        
while  (i.hasNext()) {
            Object current 
=  i.next();
            
for  ( int  index  =  getCount(current); index  >   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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值