Java tutorial
/* * $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; } }