I forgot to send the test case in the first mail, so here it comes.

--
Jan Sorensen
aragost

----- Original Message -----
From: "Jan Sorensen" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Monday, September 03, 2001 10:10 AM
Subject: [PATCH][collections] FilterIterator


> org.apache.commons.collections.FilterIterator implements the Iterator
> interface. But the Iterator is advanced with the hasNext() method, and not
> with the next(). That means that it relies on being used with alternate
> calls to hasNext() and next(), like:
>     while (iter.hasNext()) { .... iter.next(); ... }
>
> Multiple calls to next() would return the same element, and calls to
> hasNext() skip over elements.
>
> This patch fix this, and also makes the remove() throw an
> UnsupportedOperationException. The underlying iterator might not be in
sync
> with the FilterIterator so remove() is a bit hard to implement.
>
> --
> Jan Sorensen
> aragost
>
> Index: FilterIterator.java
> ===================================================================
> RCS file:
>
/home/cvspublic/jakarta-commons/collections/src/java/org/apache/commons/coll
> ections/FilterIterator.java,v
> retrieving revision 1.1
> diff -u -r1.1 FilterIterator.java
> --- FilterIterator.java 2001/05/06 11:04:25 1.1
> +++ FilterIterator.java 2001/09/03 07:48:13
> @@ -7,8 +7,8 @@
>   */
>  package org.apache.commons.collections;
>
> -import java.util.Enumeration;
>  import java.util.Iterator;
> +import java.util.NoSuchElementException;
>
>  /** A Proxy {@link Iterator Iterator} which takes a {@link Predicate
> Predicate} instance to filter
>    * out objects from an underlying {@link Iterator Iterator} instance.
> @@ -20,7 +20,9 @@
>
>      /** Holds value of property predicate. */
>      private Predicate predicate;
> +
>      private Object nextObject;
> +    private boolean nextObjectSet = false;
>
>
>
>
//-------------------------------------------------------------------------
> @@ -39,20 +41,44 @@
>      // Iterator interface
>
>
//-------------------------------------------------------------------------
>      public boolean hasNext() {
> +        if (nextObjectSet)
> +            return true;
> +        else
> +            return setNextObject();
> +    }
> +
> +    public Object next() {
> +        if (!nextObjectSet)
> +            if (!setNextObject())
> +                throw new NoSuchElementException();
> +        nextObjectSet = false;
> +        return nextObject;
> +    }
> +
> +    public void remove() {
> +        /* The unlying iterator might not be in sync, so we can't forward
> +         * the call.
> +         */
> +        throw new UnsupportedOperationException();
> +    }
> +
> +    // Private methods
> +
>
//-------------------------------------------------------------------------
> +    /** Set nextObject to the next object. If there is no more objects,
> return
> +     * false, otherwise return true
> +     */
> +    private boolean setNextObject() {
>          Iterator iterator = getIterator();
>          Predicate predicate = getPredicate();
>          while ( iterator.hasNext() ) {
>              Object object = iterator.next();
>              if ( predicate.evaluate( object ) ) {
>                  nextObject = object;
> +                nextObjectSet = true;
>                  return true;
>              }
>          }
>          return false;
> -    }
> -
> -    public Object next() {
> -        return nextObject;
>      }
>
>      // Properties
>
>

TestFilterIterator.java

Reply via email to