diff --git a/src/main/java/spliterators/part2/exercise/IndexedDoublePair.java b/src/main/java/spliterators/part2/exercise/IndexedDoublePair.java index d3c0162..424948b 100755 --- a/src/main/java/spliterators/part2/exercise/IndexedDoublePair.java +++ b/src/main/java/spliterators/part2/exercise/IndexedDoublePair.java @@ -5,15 +5,15 @@ import org.apache.commons.lang3.builder.ToStringBuilder; public class IndexedDoublePair { - private final int index; + private final long index; private final double value; - public IndexedDoublePair(int index, double value) { + public IndexedDoublePair(long index, double value) { this.index = index; this.value = value; } - public int getIndex() { + public long getIndex() { return index; } diff --git a/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java b/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java index deb4867..54b211c 100755 --- a/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java +++ b/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java @@ -1,5 +1,6 @@ package spliterators.part2.exercise; +import java.util.Comparator; import java.util.Spliterator; import java.util.Spliterators; import java.util.function.Consumer; @@ -8,13 +9,13 @@ public class ZipWithIndexDoubleSpliterator extends Spliterators.AbstractSplitera private final OfDouble inner; - private int currentIndex; + private long currentIndex; public ZipWithIndexDoubleSpliterator(OfDouble inner) { this(0, inner); } - private ZipWithIndexDoubleSpliterator(int firstIndex, OfDouble inner) { + private ZipWithIndexDoubleSpliterator(long firstIndex, OfDouble inner) { super(inner.estimateSize(), inner.characteristics()); currentIndex = firstIndex; this.inner = inner; @@ -22,35 +23,50 @@ private ZipWithIndexDoubleSpliterator(int firstIndex, OfDouble inner) { @Override public int characteristics() { - // TODO - throw new UnsupportedOperationException(); + return inner.characteristics() | NONNULL; } @Override public boolean tryAdvance(Consumer action) { - // TODO - throw new UnsupportedOperationException(); + if (inner.tryAdvance((double s) -> action.accept(new IndexedDoublePair(currentIndex, s)))) { + currentIndex++; + return true; + } else { + return false; + } } @Override public void forEachRemaining(Consumer action) { - // TODO - throw new UnsupportedOperationException(); + inner.forEachRemaining((double s) -> { + action.accept(new IndexedDoublePair(currentIndex, s)); + currentIndex++; + }); } @Override public Spliterator trySplit() { - // TODO - // if (inner.hasCharacteristics(???)) { - // use inner.trySplit - // } else - - return super.trySplit(); + if (inner.hasCharacteristics(Spliterator.SUBSIZED)) { + Spliterator spliterator = new ZipWithIndexDoubleSpliterator(currentIndex, inner.trySplit()); + currentIndex += spliterator.estimateSize(); + return spliterator; + } else{ + return super.trySplit(); + } } @Override public long estimateSize() { - // TODO - throw new UnsupportedOperationException(); + return inner.estimateSize(); + } + + @Override + public Comparator getComparator() { + if (inner.hasCharacteristics(SORTED)) { + Comparator comparator = inner.getComparator(); + return (o1, o2) -> comparator.compare(o1.getValue(), o2.getValue()); + } else { + throw new IllegalStateException(); + } } }