Mega Code Archive

 
Categories / Java / Collections Data Structure
 

A combination of two collections into a collection

/* DualCollection.java {{IS_NOTE   Purpose:        Description:        History:     Sun Sep  2 21:29:38     2007, Created by tomyeh }}IS_NOTE Copyright (C) 2007 Potix Corporation. All Rights Reserved. {{IS_RIGHT   This program is distributed under GPL Version 3.0 in the hope that   it will be useful, but WITHOUT ANY WARRANTY. }}IS_RIGHT */ import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.AbstractCollection; /**  * A combination of two collections into a collection.  *  * @author tomyeh  * @since 3.0.0  */ public class DualCollection extends AbstractCollection implements java.io.Serializable {   private final Collection _first, _second;   /** Returns a collection by combining two collections.    * It checks whether any of them is null, or equals. And, returns    * the non-null one if another is null.    * If both null, it returns null.    */   public static final   Collection combine(Collection first, Collection second) {     if (first == second) //we don't use equals to have better performance       return first;     if (first != null)       if (second != null)         return new DualCollection(first, second);       else         return first;     else       return second;   }   /** Constructor.    * It is better to use {@link #combine} instead of this method    * since it checks whether any of them is null or equals.    */   public DualCollection(Collection first, Collection second) {     _first = first != null ? first: Collections.EMPTY_LIST;     _second = second != null ? second: Collections.EMPTY_LIST;   }   //Collection//   public int size() {     return _first.size() + _second.size();   }   public Iterator iterator() {     return new Iter();   }   private class Iter implements Iterator {     private Iterator _it;     private boolean _bSecond;     private Iter() {       _it = _first.iterator();     }     public boolean hasNext() {       return _it.hasNext() || (!_bSecond && !_second.isEmpty());     }     public Object next() {       if (!_bSecond && !_it.hasNext()) {         _it = _second.iterator();         _bSecond = true;       }       return _it.next();     }     public void remove() {       _it.remove();     }   } }