Created an iterator that iterates over iterators.

git-svn-id: https://samskivert.googlecode.com/svn/trunk@458 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
mdb
2001-11-20 03:35:53 +00:00
parent 9e11a32409
commit 5cbee6d365
@@ -0,0 +1,104 @@
//
// $Id: CompoundIterator.java,v 1.1 2001/11/20 03:35:53 mdb Exp $
//
// samskivert library - useful routines for java programs
// Copyright (C) 2001 Michael Bayne
//
// This library is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package com.samskivert.util;
import java.util.Iterator;
import java.util.NoSuchElementException;
/**
* Iterates over a collection of iterators, moving seamlessly from one
* iterator to the next as the first runs out of elements. Iterators are
* made available to the compound iterator via the succinct and functional
* {@link IteratorProvider} interface.
*/
public class CompoundIterator implements Iterator
{
/** Used to obtain the set of iterators over which we will iterate. */
public static interface IteratorProvider
{
/**
* Returns the next iterator in the set. Should return null when
* we've run out of iterators.
*/
public Iterator nextIterator ();
}
/**
* Constructs a compound iterator that will iterate over all of the
* iterators provided by the supplied provider, in turn.
*/
public CompoundIterator (IteratorProvider provider)
{
_provider = provider;
// move to the first iterator
_iter = _provider.nextIterator();
}
// documentation inherited
public boolean hasNext ()
{
// keep trying iterators until we run out or find an element
while (_iter != null) {
try {
if (_iter.hasNext()) {
return true;
}
} catch (NoSuchElementException nsee) {
// have to catch this and move to the next iterator
_iter = _provider.nextIterator();
}
}
return false;
}
// documentation inherited
public Object next ()
{
// keep trying iterators until we run out or find an element
while (_iter != null) {
try {
return _iter.next();
} catch (NoSuchElementException nsee) {
// have to catch this and move to the next iterator
_iter = _provider.nextIterator();
}
}
throw new NoSuchElementException();
}
// documentation inherited
public void remove ()
{
if (_iter != null) {
_iter.remove();
} else {
throw new IllegalStateException();
}
}
/** Our provider of iterators. */
protected IteratorProvider _provider;
/** The iterator currently in use. */
protected Iterator _iter;
}