Mega Code Archive

 
Categories / Java Tutorial / Collections
 

List containing other lists

/*  * $Id: ListOfLists.java,v 1.1.1.1 2005/04/07 18:36:24 pocho Exp $  */ import java.util.AbstractList; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; /**  * Creates list containing other lists, access another list's elements as it would belong  * to this list.   *   * @version $Name:  $ - $Revision: 1.1.1.1 $ - $Date: 2005/04/07 18:36:24 $  * TODO Test  */ public class ListOfLists extends AbstractList {   private Collection lists = new ArrayList();   public ListOfLists(Collection c) {     Iterator it = c.iterator();     Object o;     while (it.hasNext()) {       o = it.next();       if (o instanceof List)         lists.add(o);       else if (o != null)         throw new UnsupportedOperationException(this.getClass().getName() +                                                 " class supports only instances "+                                                 "of java.util.List interface");     }   }   public int size() {     Iterator it = lists.iterator();     int size = 0;     Object o;     while (it.hasNext()) {       o = it.next();       if (o != null)         size += ((List) o).size();     }     return size;   }   public Object get(int index) {     int size = size();     if (index < 0)       throw new IndexOutOfBoundsException("index: " + index +"; size: " + size);     Iterator it = lists.iterator();     while (it.hasNext()) {       List list = (List) it.next();       if (index < list.size()) {         return list.get(index);       }       else         index -= list.size();     }     // if value has not been returned yet - IndexOutOfBoundsException is thrown     throw new IndexOutOfBoundsException("index: " + index +"; size: " + size);   }   /**    * Replaces the element at the specified position in underlying list with the    * specified element.    *    * @param index index of element to replace.    * @param element element to be stored at the specified position.    * @return the element previously at the specified position.    */   public Object set(int index, Object element) {     int size = size();     if (index < 0)       throw new IndexOutOfBoundsException("index: " + index +"; size: " + size);     Iterator it = lists.iterator();     while (it.hasNext()) {       List list = (List) it.next();       if (index < list.size()) {         return list.set(index, element);       }       else         index -= list.size();     }     // if value has not been returned yet - IndexOutOfBoundsException is thrown     throw new IndexOutOfBoundsException("index: " + index +"; size: " + size);   }   public int indexOf(Object o) {     ListIterator e = listIterator();     if (o==null) {       while (e.hasNext()) {         if (e.next() == null)           return e.previousIndex();       }     }     else {       Object el;       while (e.hasNext()) {         el = e.next();         if (el.equals(o))           return e.previousIndex();       }     }     return -1;   }   public int lastIndexOf(Object o) {     ListIterator e = listIterator(size());     if (o==null) {       while (e.hasPrevious()) {         if (e.previous() == null)           return e.nextIndex();       }     } else {       Object el;       while (e.hasPrevious()) {         el = e.previous();         if (el != null && el.equals(o))           return e.nextIndex();       }     }     return -1;   } }