public class CollatingIterator<E>
extends java.lang.Object
implements java.util.Iterator<E>
Given two ordered Iterator
instances A
and
B
, the next()
method on this iterator will return the
lesser of A.next()
and B.next()
.
Modifier and Type | Field and Description |
---|---|
private java.util.Comparator<? super E> |
comparator
The
Comparator used to evaluate order. |
private java.util.List<java.util.Iterator<? extends E>> |
iterators
The list of
Iterator s to evaluate. |
private int |
lastReturned
Index of the
iterator from whom the last returned
value was obtained. |
private java.util.List<E> |
values
Next objects peeked from each iterator. |
private java.util.BitSet |
valueSet
Whether or not each
values element has been set. |
Constructor and Description |
---|
CollatingIterator()
Constructs a new
CollatingIterator . |
CollatingIterator(java.util.Comparator<? super E> comp)
Constructs a new
CollatingIterator that will used the
specified comparator for ordering. |
CollatingIterator(java.util.Comparator<? super E> comp,
java.util.Collection<java.util.Iterator<? extends E>> iterators)
Constructs a new
CollatingIterator that will use the
specified comparator to provide ordered iteration over the collection of
iterators. |
CollatingIterator(java.util.Comparator<? super E> comp,
int initIterCapacity)
Constructs a new
CollatingIterator that will used the
specified comparator for ordering and have the specified initial
capacity. |
CollatingIterator(java.util.Comparator<? super E> comp,
java.util.Iterator<? extends E>[] iterators)
Constructs a new
CollatingIterator that will use the
specified comparator to provide ordered iteration over the array of
iterators. |
CollatingIterator(java.util.Comparator<? super E> comp,
java.util.Iterator<? extends E> a,
java.util.Iterator<? extends E> b)
Constructs a new
CollatingIterator that will use the
specified comparator to provide ordered iteration over the two given
iterators. |
Modifier and Type | Method and Description |
---|---|
void |
addIterator(java.util.Iterator<? extends E> iterator)
Adds the given
Iterator to the iterators being collated. |
private boolean |
anyHasNext(java.util.List<java.util.Iterator<? extends E>> iters)
Returns
true iff any Iterator in the given list has
a next value. |
private boolean |
anyValueSet(java.util.BitSet set)
Returns
true iff any bit in the given set is
true . |
private void |
checkNotStarted()
Throws
IllegalStateException if iteration has started via
start() . |
private void |
clear(int i)
|
java.util.Comparator<? super E> |
getComparator()
Gets the
Comparator by which collatation occurs. |
int |
getIteratorIndex()
Returns the index of the iterator that returned the last element.
|
java.util.List<java.util.Iterator<? extends E>> |
getIterators()
Gets the list of Iterators (unmodifiable).
|
boolean |
hasNext()
Returns
true if any child iterator has remaining elements. |
private int |
least()
|
E |
next()
Returns the next ordered element from a child iterator.
|
void |
remove()
Removes the last returned element from the child iterator that produced it.
|
private boolean |
set(int i)
|
void |
setComparator(java.util.Comparator<? super E> comp)
Sets the
Comparator by which collation occurs. |
void |
setIterator(int index,
java.util.Iterator<? extends E> iterator)
Sets the iterator at the given index.
|
private void |
start()
Initializes the collating state if it hasn't been already.
|
private java.util.Comparator<? super E> comparator
Comparator
used to evaluate order.private java.util.List<java.util.Iterator<? extends E>> iterators
Iterator
s to evaluate.private java.util.List<E> values
Next
objects peeked from each iterator.private java.util.BitSet valueSet
values
element has been set.private int lastReturned
iterator
from whom the last returned
value was obtained.public CollatingIterator()
CollatingIterator
. A comparator must be
set by calling setComparator(Comparator)
before invoking
hasNext()
, or next()
for the first time. Child
iterators will have to be manually added using the
addIterator(Iterator)
method.public CollatingIterator(java.util.Comparator<? super E> comp)
CollatingIterator
that will used the
specified comparator for ordering. Child iterators will have to be
manually added using the addIterator(Iterator)
method.comp
- the comparator to use to sort; must not be null,
unless you'll be invoking setComparator(Comparator)
later on.public CollatingIterator(java.util.Comparator<? super E> comp, int initIterCapacity)
CollatingIterator
that will used the
specified comparator for ordering and have the specified initial
capacity. Child iterators will have to be manually added using the
addIterator(Iterator)
method.comp
- the comparator to use to sort; must not be null,
unless you'll be invoking setComparator(Comparator)
later on.initIterCapacity
- the initial capacity for the internal list of
child iteratorspublic CollatingIterator(java.util.Comparator<? super E> comp, java.util.Iterator<? extends E> a, java.util.Iterator<? extends E> b)
CollatingIterator
that will use the
specified comparator to provide ordered iteration over the two given
iterators.comp
- the comparator to use to sort; must not be null,
unless you'll be invoking setComparator(Comparator)
later on.a
- the first child ordered iteratorb
- the second child ordered iteratorjava.lang.NullPointerException
- if either iterator is nullpublic CollatingIterator(java.util.Comparator<? super E> comp, java.util.Iterator<? extends E>[] iterators)
CollatingIterator
that will use the
specified comparator to provide ordered iteration over the array of
iterators.comp
- the comparator to use to sort; must not be null,
unless you'll be invoking setComparator(Comparator)
later on.iterators
- the array of iteratorsjava.lang.NullPointerException
- if iterators array is or contains nullpublic CollatingIterator(java.util.Comparator<? super E> comp, java.util.Collection<java.util.Iterator<? extends E>> iterators)
CollatingIterator
that will use the
specified comparator to provide ordered iteration over the collection of
iterators.comp
- the comparator to use to sort; must not be null,
unless you'll be invoking setComparator(Comparator)
later on.iterators
- the collection of iteratorsjava.lang.NullPointerException
- if the iterators collection is or contains nulljava.lang.ClassCastException
- if the iterators collection contains an
element that's not an Iterator
public void addIterator(java.util.Iterator<? extends E> iterator)
Iterator
to the iterators being collated.iterator
- the iterator to add to the collation, must not be nulljava.lang.IllegalStateException
- if iteration has startedjava.lang.NullPointerException
- if the iterator is nullpublic void setIterator(int index, java.util.Iterator<? extends E> iterator)
index
- index of the Iterator to replaceiterator
- Iterator to place at the given indexjava.lang.IndexOutOfBoundsException
- if index < 0 or index > size()java.lang.IllegalStateException
- if iteration has startedjava.lang.NullPointerException
- if the iterator is nullpublic java.util.List<java.util.Iterator<? extends E>> getIterators()
public java.util.Comparator<? super E> getComparator()
Comparator
by which collatation occurs.Comparator
public void setComparator(java.util.Comparator<? super E> comp)
Comparator
by which collation occurs. If you
would like to use the natural sort order (or, in other words,
if the elements in the iterators are implementing the
Comparable
interface), then use the
ComparableComparator
.comp
- the Comparator
to setjava.lang.IllegalStateException
- if iteration has startedpublic boolean hasNext()
true
if any child iterator has remaining elements.hasNext
in interface java.util.Iterator<E>
public E next() throws java.util.NoSuchElementException
next
in interface java.util.Iterator<E>
java.util.NoSuchElementException
- if no child iterator has any more elementspublic void remove()
remove
in interface java.util.Iterator<E>
java.lang.IllegalStateException
- if there is no last returned element, or if
the last returned element has already been removedpublic int getIteratorIndex()
java.lang.IllegalStateException
- if there is no last returned elementprivate void start()
private boolean set(int i)
values
and valueSet
attributes at position
i to the next value of the iterator
at position
i, or clear them if the ith iterator has no next
value.false
iff there was no value to setprivate void clear(int i)
private void checkNotStarted() throws java.lang.IllegalStateException
IllegalStateException
if iteration has started via
start()
.java.lang.IllegalStateException
- if iteration startedprivate int least()
java.lang.NullPointerException
- if no comparator is setprivate boolean anyValueSet(java.util.BitSet set)
true
iff any bit in the given set is
true
.private boolean anyHasNext(java.util.List<java.util.Iterator<? extends E>> iters)
true
iff any Iterator
in the given list has
a next value.