From ebaf2cf5e31da35af34e21009d76cf00da56adc5 Mon Sep 17 00:00:00 2001 From: Iartsev Kirill Date: Tue, 18 Jul 2017 16:16:30 +0300 Subject: [PATCH 1/7] part2 partially completed --- .../ZipWithIndexDoubleSpliterator.java | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java b/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java index deb4867..be5014c 100755 --- a/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java +++ b/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java @@ -2,13 +2,14 @@ import java.util.Spliterator; import java.util.Spliterators; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; public class ZipWithIndexDoubleSpliterator extends Spliterators.AbstractSpliterator { private final OfDouble inner; - private int currentIndex; + private AtomicInteger currentIndex; public ZipWithIndexDoubleSpliterator(OfDouble inner) { this(0, inner); @@ -16,41 +17,48 @@ public ZipWithIndexDoubleSpliterator(OfDouble inner) { private ZipWithIndexDoubleSpliterator(int firstIndex, OfDouble inner) { super(inner.estimateSize(), inner.characteristics()); - currentIndex = firstIndex; + if (! inner.hasCharacteristics(SUBSIZED)) throw new IllegalStateException("Zip got not subsized Spliterator"); + currentIndex = new AtomicInteger(firstIndex); this.inner = inner; } @Override public int characteristics() { - // TODO - throw new UnsupportedOperationException(); + int characteristics = inner.characteristics(); + characteristics &= ~SORTED; + return characteristics; } @Override public boolean tryAdvance(Consumer action) { // TODO - throw new UnsupportedOperationException(); + final boolean res = + inner.tryAdvance((Double v) -> + action.accept(new IndexedDoublePair(currentIndex.get(), v))); + if (res) currentIndex.incrementAndGet(); + return res; } @Override public void forEachRemaining(Consumer action) { // TODO - throw new UnsupportedOperationException(); + inner.forEachRemaining((Double v) -> { + action.accept(new IndexedDoublePair(currentIndex.get(), v)); + currentIndex.incrementAndGet(); + }); } @Override public Spliterator trySplit() { // TODO - // if (inner.hasCharacteristics(???)) { - // use inner.trySplit - // } else - - return super.trySplit(); + if (inner.hasCharacteristics(SUBSIZED)) { + return new ZipWithIndexDoubleSpliterator(inner.trySplit()); + } else return super.trySplit(); } @Override public long estimateSize() { // TODO - throw new UnsupportedOperationException(); + return inner.estimateSize(); } } From d656755a7f8d890141ddc0f186e62aae8cb5093c Mon Sep 17 00:00:00 2001 From: Iartsev Kirill Date: Tue, 18 Jul 2017 18:43:13 +0300 Subject: [PATCH 2/7] part3 partially complited --- .../exercise/ZipWithArraySpliterator.java | 44 +++++++++++++++---- .../example/ZipWithArraySpliteratorTest.java | 32 ++++++++++++++ 2 files changed, 68 insertions(+), 8 deletions(-) create mode 100644 src/test/java/spliterators/part2/example/ZipWithArraySpliteratorTest.java diff --git a/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java b/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java index 292137e..82ce88c 100755 --- a/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java +++ b/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java @@ -2,47 +2,75 @@ import java.util.Spliterator; import java.util.Spliterators; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; public class ZipWithArraySpliterator extends Spliterators.AbstractSpliterator> { - private final Spliterator inner; private final B[] array; + private final AtomicLong startInclusive; + private final long endExclusive; public ZipWithArraySpliterator(Spliterator inner, B[] array) { - super(Long.MAX_VALUE, 0); // FIXME: + super(array.length, inner.characteristics()); // TODO - throw new UnsupportedOperationException(); + this.inner = inner; + this.array = array; + this.endExclusive = array.length; + startInclusive = new AtomicLong(); + } + + private ZipWithArraySpliterator(Spliterator inner, B[] array, long startInclusive, long endExclusive) { + super(array.length, inner.characteristics()); + // TODO + this.inner = inner; + this.array = array; + this.startInclusive = new AtomicLong(startInclusive); + this.endExclusive = endExclusive; } @Override public int characteristics() { // TODO - throw new UnsupportedOperationException(); + int characteristics = inner.characteristics(); + if (!inner.hasCharacteristics(SUBSIZED)) + throw new IllegalStateException(); + characteristics &= ~SORTED; + return characteristics; } @Override public boolean tryAdvance(Consumer> action) { // TODO - throw new UnsupportedOperationException(); + if (startInclusive.get() >= endExclusive) return false; + + inner.tryAdvance(v -> action.accept( + new Pair<>(v, array[(int) startInclusive.get()])) + ); + return true; } @Override public void forEachRemaining(Consumer> action) { // TODO - throw new UnsupportedOperationException(); + inner.forEachRemaining( + v -> action.accept(new Pair<>(v, array[(int) startInclusive.get()])) + ); } @Override public Spliterator> trySplit() { // TODO - throw new UnsupportedOperationException(); + final Spliterator part = inner.trySplit(); + final long prevStartInclusive = startInclusive.getAndAdd(part.estimateSize()); + return new ZipWithArraySpliterator<>(inner, array, prevStartInclusive, startInclusive.get()); } @Override public long estimateSize() { // TODO - throw new UnsupportedOperationException(); + return endExclusive - startInclusive.get(); } } diff --git a/src/test/java/spliterators/part2/example/ZipWithArraySpliteratorTest.java b/src/test/java/spliterators/part2/example/ZipWithArraySpliteratorTest.java new file mode 100644 index 0000000..3d8db6e --- /dev/null +++ b/src/test/java/spliterators/part2/example/ZipWithArraySpliteratorTest.java @@ -0,0 +1,32 @@ +package spliterators.part2.example; + +import org.junit.Test; +import spliterators.part1.example.ArrayExample; +import spliterators.part3.exercise.ZipWithArraySpliterator; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +/** + * Created by whobscr on 18.07.17. + */ +public class ZipWithArraySpliteratorTest { + + private int[] getRandomArray(int length) { + final int[] result = new int[length]; + + for (int i = 0; i < length; i++) + result[i] = ThreadLocalRandom.current().nextInt(); + + return result; + } + + @Test + public void zerosSuccess() { + final int[] randomArray = getRandomArray(1000); + final int[] array = getRandomArray(1000); + StreamSupport.stream(new ZipWithArraySpliterator(new ArrayExample.IntArraySpliterator(randomArray), array)) + .collect(Collectors.toList()); + } +} From 44aa6f7906061c07374fae40a410f27a915669a9 Mon Sep 17 00:00:00 2001 From: Iartsev Kirill Date: Wed, 19 Jul 2017 18:08:28 +0300 Subject: [PATCH 3/7] part3 partially completed --- .../exercise/ZipWithArraySpliterator.java | 10 +++-- .../example/ZipWithArraySpliteratorTest.java | 42 +++++++++++++++---- 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java b/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java index 82ce88c..5065b07 100755 --- a/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java +++ b/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java @@ -49,6 +49,7 @@ public boolean tryAdvance(Consumer> action) { inner.tryAdvance(v -> action.accept( new Pair<>(v, array[(int) startInclusive.get()])) ); + startInclusive.incrementAndGet(); return true; } @@ -56,7 +57,8 @@ public boolean tryAdvance(Consumer> action) { public void forEachRemaining(Consumer> action) { // TODO inner.forEachRemaining( - v -> action.accept(new Pair<>(v, array[(int) startInclusive.get()])) + v -> + action.accept(new Pair<>(v, array[(int) startInclusive.getAndIncrement()])) ); } @@ -64,8 +66,10 @@ public void forEachRemaining(Consumer> action) { public Spliterator> trySplit() { // TODO final Spliterator part = inner.trySplit(); - final long prevStartInclusive = startInclusive.getAndAdd(part.estimateSize()); - return new ZipWithArraySpliterator<>(inner, array, prevStartInclusive, startInclusive.get()); + if (part != null) { + final long prevStartInclusive = startInclusive.getAndAdd(part.estimateSize()); + return new ZipWithArraySpliterator<>(part, array, prevStartInclusive, startInclusive.get()); + } else return null; } @Override diff --git a/src/test/java/spliterators/part2/example/ZipWithArraySpliteratorTest.java b/src/test/java/spliterators/part2/example/ZipWithArraySpliteratorTest.java index 3d8db6e..5535f18 100644 --- a/src/test/java/spliterators/part2/example/ZipWithArraySpliteratorTest.java +++ b/src/test/java/spliterators/part2/example/ZipWithArraySpliteratorTest.java @@ -2,19 +2,19 @@ import org.junit.Test; import spliterators.part1.example.ArrayExample; +import spliterators.part3.exercise.Pair; import spliterators.part3.exercise.ZipWithArraySpliterator; +import java.util.*; import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import java.util.stream.StreamSupport; -/** - * Created by whobscr on 18.07.17. - */ public class ZipWithArraySpliteratorTest { - private int[] getRandomArray(int length) { - final int[] result = new int[length]; + private Integer[] getRandomArray(int length) { + final Integer[] result = new Integer[length]; for (int i = 0; i < length; i++) result[i] = ThreadLocalRandom.current().nextInt(); @@ -24,9 +24,33 @@ private int[] getRandomArray(int length) { @Test public void zerosSuccess() { - final int[] randomArray = getRandomArray(1000); - final int[] array = getRandomArray(1000); - StreamSupport.stream(new ZipWithArraySpliterator(new ArrayExample.IntArraySpliterator(randomArray), array)) - .collect(Collectors.toList()); + final Integer[] randomArray = getRandomArray(10); + final Integer[] array = getRandomArray(10); + final ZipWithArraySpliterator spliterator = new ZipWithArraySpliterator<>( + Spliterators.spliterator(randomArray, 0), array); + final List> pairs = new ArrayList<>(); +// getPairs(spliterator, pairs); + + List> actual = StreamSupport.stream(spliterator, true) +// .map(p -> new Pair<>(p.getA().hashCode() + 1, p.getB() + 1)) +// .map(Pair::toString) + .collect(Collectors.toList()); + System.out.println(pairs); + } + + private void getPairs(Spliterator> spliterator, List> list) { + final Spliterator> newSpliterator = spliterator.trySplit(); + if (newSpliterator != null) { + getPairs(newSpliterator, list); + getPairs(spliterator, list); + } else { + AtomicInteger first = new AtomicInteger(); + AtomicInteger second = new AtomicInteger(); + spliterator.tryAdvance(p -> { + first.set(p.getA()); + second.set(p.getB()); + }); + list.add(new Pair<>(first.get(), second.get())); + } } } From 039d140cd6fba1b14f718b33d35093d8556647dc Mon Sep 17 00:00:00 2001 From: Iartsev Kirill Date: Thu, 20 Jul 2017 15:17:20 +0300 Subject: [PATCH 4/7] part3 partially completed --- .../part3/exercise/ZipWithArraySpliterator.java | 7 +++++-- .../part2/example/ZipWithArraySpliteratorTest.java | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java b/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java index 5065b07..788e55a 100755 --- a/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java +++ b/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java @@ -57,8 +57,11 @@ public boolean tryAdvance(Consumer> action) { public void forEachRemaining(Consumer> action) { // TODO inner.forEachRemaining( - v -> - action.accept(new Pair<>(v, array[(int) startInclusive.getAndIncrement()])) + v -> { + action.accept(new Pair<>(v, array[(int) startInclusive.getAndIncrement()])); + System.out.println(v); + return; + } ); } diff --git a/src/test/java/spliterators/part2/example/ZipWithArraySpliteratorTest.java b/src/test/java/spliterators/part2/example/ZipWithArraySpliteratorTest.java index 5535f18..6f68583 100644 --- a/src/test/java/spliterators/part2/example/ZipWithArraySpliteratorTest.java +++ b/src/test/java/spliterators/part2/example/ZipWithArraySpliteratorTest.java @@ -31,7 +31,7 @@ public void zerosSuccess() { final List> pairs = new ArrayList<>(); // getPairs(spliterator, pairs); - List> actual = StreamSupport.stream(spliterator, true) + List> actual = StreamSupport.stream(spliterator, false) // .map(p -> new Pair<>(p.getA().hashCode() + 1, p.getB() + 1)) // .map(Pair::toString) .collect(Collectors.toList()); From 8a411f3b6437f1f969ddf85325ce49c96f8dcf49 Mon Sep 17 00:00:00 2001 From: Iartsev Kirill Date: Mon, 31 Jul 2017 15:22:12 +0300 Subject: [PATCH 5/7] part3 completed --- .../exercise/ZipWithArraySpliterator.java | 9 +-- .../example/ZipWithArraySpliteratorTest.java | 77 +++++++++++++------ 2 files changed, 57 insertions(+), 29 deletions(-) diff --git a/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java b/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java index 788e55a..e3062ed 100755 --- a/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java +++ b/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java @@ -56,13 +56,10 @@ public boolean tryAdvance(Consumer> action) { @Override public void forEachRemaining(Consumer> action) { // TODO - inner.forEachRemaining( - v -> { + inner.forEachRemaining(v -> { + if (startInclusive.get() < array.length) action.accept(new Pair<>(v, array[(int) startInclusive.getAndIncrement()])); - System.out.println(v); - return; - } - ); + }); } @Override diff --git a/src/test/java/spliterators/part2/example/ZipWithArraySpliteratorTest.java b/src/test/java/spliterators/part2/example/ZipWithArraySpliteratorTest.java index 6f68583..a6d8f2f 100644 --- a/src/test/java/spliterators/part2/example/ZipWithArraySpliteratorTest.java +++ b/src/test/java/spliterators/part2/example/ZipWithArraySpliteratorTest.java @@ -11,6 +11,9 @@ import java.util.stream.Collectors; import java.util.stream.StreamSupport; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.*; + public class ZipWithArraySpliteratorTest { private Integer[] getRandomArray(int length) { @@ -23,34 +26,62 @@ private Integer[] getRandomArray(int length) { } @Test - public void zerosSuccess() { - final Integer[] randomArray = getRandomArray(10); + public void innerIsOfGreaterLengthSuccess() { + final Integer[] innerArray = getRandomArray(30); + final Integer[] array = getRandomArray(10); + + final ZipWithArraySpliterator spliterator = new ZipWithArraySpliterator<>( + Spliterators.spliterator(innerArray, 0), array); + + final List actual = StreamSupport.stream(spliterator, false) + .map(p -> new Pair<>(p.getA().hashCode() + 1, p.getB() + 1)) + .map(Pair::toString) + .collect(Collectors.toList()); + assertThat(actual.size(), is(10)); + } + + @Test + public void ArrayIsOfGreaterLengthSuccess() { + final Integer[] innerArray = getRandomArray(10); + final Integer[] array = getRandomArray(30); + + final ZipWithArraySpliterator spliterator = new ZipWithArraySpliterator<>( + Spliterators.spliterator(innerArray, 0), array); + + final List actual = StreamSupport.stream(spliterator, false) + .map(p -> new Pair<>(p.getA().hashCode() + 1, p.getB() + 1)) + .map(Pair::toString) + .collect(Collectors.toList()); + assertThat(actual.size(), is(10)); + } + + @Test + public void nonzeroLengthSuccess() { + final Integer[] innerArray = getRandomArray(10); final Integer[] array = getRandomArray(10); + final ZipWithArraySpliterator spliterator = new ZipWithArraySpliterator<>( - Spliterators.spliterator(randomArray, 0), array); - final List> pairs = new ArrayList<>(); -// getPairs(spliterator, pairs); + Spliterators.spliterator(innerArray, 0), array); - List> actual = StreamSupport.stream(spliterator, false) -// .map(p -> new Pair<>(p.getA().hashCode() + 1, p.getB() + 1)) -// .map(Pair::toString) + final List actual = StreamSupport.stream(spliterator, false) + .map(p -> new Pair<>(p.getA().hashCode() + 1, p.getB() + 1)) + .map(Pair::toString) .collect(Collectors.toList()); - System.out.println(pairs); + assertThat(actual.size(), is(10)); } - private void getPairs(Spliterator> spliterator, List> list) { - final Spliterator> newSpliterator = spliterator.trySplit(); - if (newSpliterator != null) { - getPairs(newSpliterator, list); - getPairs(spliterator, list); - } else { - AtomicInteger first = new AtomicInteger(); - AtomicInteger second = new AtomicInteger(); - spliterator.tryAdvance(p -> { - first.set(p.getA()); - second.set(p.getB()); - }); - list.add(new Pair<>(first.get(), second.get())); - } + @Test + public void zeroLengthSuccess() { + final Integer[] innerArray = getRandomArray(0); + final Integer[] array = getRandomArray(0); + + final ZipWithArraySpliterator spliterator = new ZipWithArraySpliterator<>( + Spliterators.spliterator(innerArray, 0), array); + + final List actual = StreamSupport.stream(spliterator, false) + .map(p -> new Pair<>(p.getA().hashCode() + 1, p.getB() + 1)) + .map(Pair::toString) + .collect(Collectors.toList()); + assertThat(actual.size(), is(0)); } } From 6c8bdee05169680351587e5ebe55e736768b264e Mon Sep 17 00:00:00 2001 From: Iartsev Kirill Date: Mon, 31 Jul 2017 15:31:03 +0300 Subject: [PATCH 6/7] removed changes from part2 --- .../ZipWithIndexDoubleSpliterator.java | 31 +++++++------------ 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java b/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java index be5014c..dd6fc16 100755 --- a/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java +++ b/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java @@ -9,7 +9,7 @@ public class ZipWithIndexDoubleSpliterator extends Spliterators.AbstractSplitera private final OfDouble inner; - private AtomicInteger currentIndex; + private int currentIndex; public ZipWithIndexDoubleSpliterator(OfDouble inner) { this(0, inner); @@ -17,48 +17,41 @@ public ZipWithIndexDoubleSpliterator(OfDouble inner) { private ZipWithIndexDoubleSpliterator(int firstIndex, OfDouble inner) { super(inner.estimateSize(), inner.characteristics()); - if (! inner.hasCharacteristics(SUBSIZED)) throw new IllegalStateException("Zip got not subsized Spliterator"); - currentIndex = new AtomicInteger(firstIndex); + currentIndex = firstIndex; this.inner = inner; } @Override public int characteristics() { - int characteristics = inner.characteristics(); - characteristics &= ~SORTED; - return characteristics; + // TODO + throw new UnsupportedOperationException(); } @Override public boolean tryAdvance(Consumer action) { // TODO - final boolean res = - inner.tryAdvance((Double v) -> - action.accept(new IndexedDoublePair(currentIndex.get(), v))); - if (res) currentIndex.incrementAndGet(); - return res; + throw new UnsupportedOperationException(); } @Override public void forEachRemaining(Consumer action) { // TODO - inner.forEachRemaining((Double v) -> { - action.accept(new IndexedDoublePair(currentIndex.get(), v)); - currentIndex.incrementAndGet(); - }); + throw new UnsupportedOperationException(); } @Override public Spliterator trySplit() { // TODO - if (inner.hasCharacteristics(SUBSIZED)) { - return new ZipWithIndexDoubleSpliterator(inner.trySplit()); - } else return super.trySplit(); + // if (inner.hasCharacteristics(???)) { + // use inner.trySplit + // } else + + return super.trySplit(); } @Override public long estimateSize() { // TODO - return inner.estimateSize(); + throw new UnsupportedOperationException(); } } From 83814ac3c69d8eb54acbbf5b957f0aed09352163 Mon Sep 17 00:00:00 2001 From: Iartsev Kirill Date: Mon, 31 Jul 2017 15:32:17 +0300 Subject: [PATCH 7/7] removed changes from part2 --- .../part2/exercise/ZipWithIndexDoubleSpliterator.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java b/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java index dd6fc16..deb4867 100755 --- a/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java +++ b/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java @@ -2,7 +2,6 @@ import java.util.Spliterator; import java.util.Spliterators; -import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; public class ZipWithIndexDoubleSpliterator extends Spliterators.AbstractSpliterator {