From 070c3c758303320ba13c1e5581b26a5166752b60 Mon Sep 17 00:00:00 2001 From: Elena_Fedorovskaia Date: Tue, 18 Jul 2017 16:45:46 +0300 Subject: [PATCH] part 3 is done --- .../exercise/ZipWithArraySpliterator.java | 49 ++++++++++++++----- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java b/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java index 292137e..c718925 100755 --- a/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java +++ b/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java @@ -9,40 +9,63 @@ public class ZipWithArraySpliterator extends Spliterators.AbstractSplitera private final Spliterator inner; private final B[] array; + private int index; public ZipWithArraySpliterator(Spliterator inner, B[] array) { - super(Long.MAX_VALUE, 0); // FIXME: - // TODO - throw new UnsupportedOperationException(); + this(inner, array, 0); + } + + public ZipWithArraySpliterator(Spliterator inner, B[] array, int index) { + super(Math.min(inner.estimateSize(), array.length - index), inner.characteristics()); + this.inner = inner; + this.array = array; + this.index = index; } @Override public int characteristics() { - // TODO - throw new UnsupportedOperationException(); + return inner.characteristics() & ~Spliterator.SORTED; } @Override public boolean tryAdvance(Consumer> action) { - // TODO - throw new UnsupportedOperationException(); + return index < array.length && inner.tryAdvance(a -> { + Pair pair = new Pair<>(a, array[index]); + index += 1; + action.accept(pair); + }); } @Override public void forEachRemaining(Consumer> action) { - // TODO - throw new UnsupportedOperationException(); + if (inner.hasCharacteristics(SIZED) && inner.estimateSize() <= array.length - index) { + inner.forEachRemaining(a -> { + Pair pair = new Pair<>(a, array[index]); + index += 1; + action.accept(pair); + }); + } else { + super.forEachRemaining(action); + } } @Override public Spliterator> trySplit() { - // TODO - throw new UnsupportedOperationException(); + if (inner.hasCharacteristics(SUBSIZED)) { + Spliterator split = inner.trySplit(); + if (split == null) { + return null; + } + final ZipWithArraySpliterator spliterator = new ZipWithArraySpliterator<>(split, array, index); + index = Math.min((int) (index + split.estimateSize()), array.length); + return spliterator; + } else { + return super.trySplit(); + } } @Override public long estimateSize() { - // TODO - throw new UnsupportedOperationException(); + return Math.min(inner.estimateSize(), array.length - index); } }