From 1472ab3082eecef164b5bae95a1dac6daee9f61e Mon Sep 17 00:00:00 2001 From: vidinalex Date: Mon, 17 Jul 2017 17:20:06 +0300 Subject: [PATCH 1/2] part 2 completed --- .../example/ArrayZipWithIndexExample.java | 1 - .../part2/exercise/IndexedDoublePair.java | 6 +- .../ZipWithIndexDoubleSpliterator.java | 36 ++++++------ .../ZipWithIndexDoubleSpliteratorTest.java | 57 +++++++++++++++++++ 4 files changed, 80 insertions(+), 20 deletions(-) create mode 100644 src/test/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliteratorTest.java diff --git a/src/main/java/spliterators/part2/example/ArrayZipWithIndexExample.java b/src/main/java/spliterators/part2/example/ArrayZipWithIndexExample.java index dd00263..96da908 100755 --- a/src/main/java/spliterators/part2/example/ArrayZipWithIndexExample.java +++ b/src/main/java/spliterators/part2/example/ArrayZipWithIndexExample.java @@ -8,7 +8,6 @@ public class ArrayZipWithIndexExample { public static class IndexedArraySpliterator extends Spliterators.AbstractSpliterator> { - private final T[] array; private int startInclusive; private final int endExclusive; 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..aec0551 100755 --- a/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java +++ b/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java @@ -1,20 +1,20 @@ package spliterators.part2.exercise; +import java.util.Comparator; import java.util.Spliterator; import java.util.Spliterators; import java.util.function.Consumer; public class ZipWithIndexDoubleSpliterator extends Spliterators.AbstractSpliterator { - 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 +22,39 @@ private ZipWithIndexDoubleSpliterator(int firstIndex, OfDouble inner) { @Override public int characteristics() { - // TODO - throw new UnsupportedOperationException(); + return inner.characteristics() | Spliterator.DISTINCT /*& ~Spliterator.SORTED*/; } @Override public boolean tryAdvance(Consumer action) { - // TODO - throw new UnsupportedOperationException(); + return inner.tryAdvance((double d) -> action.accept(new IndexedDoublePair(currentIndex++, d))); + } + + @Override + public Comparator getComparator() { + return (i1, i2) -> inner.getComparator().compare(i1.getValue(),i2.getValue()); } @Override public void forEachRemaining(Consumer action) { - // TODO - throw new UnsupportedOperationException(); + inner.forEachRemaining( + (double d) -> action.accept(new IndexedDoublePair(currentIndex++, d)) + ); } @Override public Spliterator trySplit() { - // TODO - // if (inner.hasCharacteristics(???)) { - // use inner.trySplit - // } else + if (inner.hasCharacteristics(Spliterator.SUBSIZED)) { + OfDouble ofDouble = inner.trySplit(); + return new ZipWithIndexDoubleSpliterator(currentIndex + ofDouble.estimateSize(), ofDouble); + } else { + return super.trySplit(); + } - return super.trySplit(); } @Override public long estimateSize() { - // TODO - throw new UnsupportedOperationException(); + return inner.estimateSize(); } } diff --git a/src/test/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliteratorTest.java b/src/test/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliteratorTest.java new file mode 100644 index 0000000..b290561 --- /dev/null +++ b/src/test/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliteratorTest.java @@ -0,0 +1,57 @@ +package spliterators.part2.exercise; + +import org.junit.Test; + +import java.util.Spliterator; +import java.util.stream.DoubleStream; +import java.util.stream.StreamSupport; + +import static org.junit.Assert.*; + +/** + * Created by student on 7/17/17. + */ +public class ZipWithIndexDoubleSpliteratorTest { + + private int maxSize; + + @Test + public void testPar() { + maxSize = 100; + Spliterator.OfDouble spliterator = DoubleStream.iterate(1.0, i -> i + 0.1) + .limit(maxSize) + .spliterator(); + + double sum = StreamSupport.stream(new ZipWithIndexDoubleSpliterator(spliterator), true) + .mapToDouble(z -> z.getIndex()*z.getValue()) + .sum(); + + double res = 0.0; + + for (int i = 0; i < maxSize; ++i) { + res += i * (1.0 + 0.1*i); + } + + assertEquals(sum, res, 0.1); + } + + @Test + public void testSeq() { + maxSize = 100; + Spliterator.OfDouble spliterator = DoubleStream.iterate(1.0, i -> i + 0.1) + .limit(maxSize) + .spliterator(); + + double sum = StreamSupport.stream(new ZipWithIndexDoubleSpliterator(spliterator), false) + .mapToDouble(z -> z.getIndex()*z.getValue()) + .sum(); + + double res = 0.0; + + for (int i = 0; i < maxSize; ++i) { + res += i * (1.0 + 0.1*i); + } + + assertEquals(sum, res, 0.1); + } +} \ No newline at end of file From 60e1fc4d9259b53f539e3b85fe9d537639e20d5b Mon Sep 17 00:00:00 2001 From: vidinalex Date: Mon, 17 Jul 2017 17:33:09 +0300 Subject: [PATCH 2/2] part2 completed --- .../ZipWithIndexDoubleSpliterator.java | 3 ++- .../ZipWithIndexDoubleSpliteratorTest.java | 24 +++++++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java b/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java index aec0551..8bc9ddf 100755 --- a/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java +++ b/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java @@ -46,7 +46,8 @@ public void forEachRemaining(Consumer action) { public Spliterator trySplit() { if (inner.hasCharacteristics(Spliterator.SUBSIZED)) { OfDouble ofDouble = inner.trySplit(); - return new ZipWithIndexDoubleSpliterator(currentIndex + ofDouble.estimateSize(), ofDouble); + currentIndex = currentIndex + estimateSize() / 2; + return new ZipWithIndexDoubleSpliterator(0, ofDouble); } else { return super.trySplit(); } diff --git a/src/test/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliteratorTest.java b/src/test/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliteratorTest.java index b290561..33a9b38 100644 --- a/src/test/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliteratorTest.java +++ b/src/test/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliteratorTest.java @@ -2,6 +2,7 @@ import org.junit.Test; +import java.util.Arrays; import java.util.Spliterator; import java.util.stream.DoubleStream; import java.util.stream.StreamSupport; @@ -17,24 +18,36 @@ public class ZipWithIndexDoubleSpliteratorTest { @Test public void testPar() { - maxSize = 100; + maxSize = 10000; Spliterator.OfDouble spliterator = DoubleStream.iterate(1.0, i -> i + 0.1) .limit(maxSize) .spliterator(); - double sum = StreamSupport.stream(new ZipWithIndexDoubleSpliterator(spliterator), true) + + double[] array = generateDouble(); + double sum = StreamSupport.stream(new ZipWithIndexDoubleSpliterator(Arrays.spliterator(array)), true) .mapToDouble(z -> z.getIndex()*z.getValue()) .sum(); double res = 0.0; for (int i = 0; i < maxSize; ++i) { - res += i * (1.0 + 0.1*i); + res += i * (array[i]); } assertEquals(sum, res, 0.1); } + private double[] generateDouble() { + double[] doubles = new double[maxSize]; + + for (double aDouble : doubles) { + aDouble = Math.random(); + } + + return doubles; + } + @Test public void testSeq() { maxSize = 100; @@ -42,14 +55,15 @@ public void testSeq() { .limit(maxSize) .spliterator(); - double sum = StreamSupport.stream(new ZipWithIndexDoubleSpliterator(spliterator), false) + double[] array = generateDouble(); + double sum = StreamSupport.stream(new ZipWithIndexDoubleSpliterator(Arrays.spliterator(array)), false) .mapToDouble(z -> z.getIndex()*z.getValue()) .sum(); double res = 0.0; for (int i = 0; i < maxSize; ++i) { - res += i * (1.0 + 0.1*i); + res += i * (array[i]); } assertEquals(sum, res, 0.1);