Author: billbarker Date: Fri Dec 11 06:38:20 2009 New Revision: 889516 URL: http://svn.apache.org/viewvc?rev=889516&view=rev Log: Initial fixes to the iterators.
This fixes the default sparseIterator problem where a RealVector only contains zero elements, and add a sparseIterator to the OpenMapRealVector. Still TODO: 1) add unit tests 2) remove *mapTo and *mapToSelf from OpenMapRealVector 3) fix javadocs 4) remove support for non-zero default values in OpenMapRealVector Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/OpenMapRealVector.java Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java?rev=889516&r1=889515&r2=889516&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java Fri Dec 11 06:38:20 2009 @@ -769,9 +769,15 @@ if (current.getValue() == 0) { advance(current); } - next = new EntryImpl(); - next.setIndex(current.getIndex()); - advance(next); + if(current.getIndex() >= 0){ + // There is at least one non-zero entry + next = new EntryImpl(); + next.setIndex(current.getIndex()); + advance(next); + } else { + // The vector consists of only zero entries, so deny having a next + current = null; + } } /** Advance an entry up to the next non null one. Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/OpenMapRealVector.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/OpenMapRealVector.java?rev=889516&r1=889515&r2=889516&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/OpenMapRealVector.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/OpenMapRealVector.java Fri Dec 11 06:38:20 2009 @@ -1250,4 +1250,70 @@ return (double)entries.size()/(double)getDimension(); } + /** @{InheritDoc} */ + public java.util.Iterator<Entry> sparseIterator() { + return new OpenMapSparseIterator(); + } + + /** + * Implementation of <code>Entry</code> optimized for OpenMap. + * <p>This implementation does not allow arbitrary calls to <code>setIndex</code> + * since the order that entries are returned is undefined. + */ + protected class OpenMapEntry extends Entry { + private final Iterator iter; + + protected OpenMapEntry(Iterator iter) { + this.iter = iter; + } + /** {...@inheritdoc} */ + @Override + public double getValue() { + return iter.value(); + } + + /** {...@inheritdoc} */ + @Override + public void setValue(double value) { + entries.put(iter.key(), value); + } + + /** {...@inheritdoc} */ + @Override + public int getIndex() { + return iter.key(); + } + } + + /** + * Iterator class to do iteration over just the non-zero elements. + * <p>This implementation is fail-fast, so cannot be used to modify any zero element. + * + */ + + protected class OpenMapSparseIterator implements java.util.Iterator<Entry> { + private final Iterator iter; + private final Entry current; + + protected OpenMapSparseIterator() { + iter = entries.iterator(); + current = new OpenMapEntry(iter); + } + + /** {...@inheritdoc} */ + public boolean hasNext() { + return iter.hasNext(); + } + + /** {...@inheritdoc} */ + public Entry next() { + iter.advance(); + return current; + } + + public void remove() { + throw new UnsupportedOperationException("Not supported"); + } + + } }