@Override public Iterator<T> iterator() { return new SamplingIterator<T>(delegate.iterator(), samplingRate); }
@Test public void testEmptyCase() { assertFalse(new SamplingIterator<Integer>(new CountingIterator(0), 0.9999).hasNext()); assertFalse(new SamplingIterator<Integer>(new CountingIterator(0), 1).hasNext()); }
@Override protected T computeNext() { int toSkip = geometricDistribution.sample(); if (delegate instanceof SkippingIterator<?>) { SkippingIterator<? extends T> skippingDelegate = (SkippingIterator<? extends T>) delegate; skippingDelegate.skip(toSkip); if (skippingDelegate.hasNext()) { return skippingDelegate.next(); } } else { for (int i = 0; i < toSkip && delegate.hasNext(); i++) { delegate.next(); } if (delegate.hasNext()) { return delegate.next(); } } return endOfData(); }
@Override protected T computeNext() { int toSkip = geometricDistribution.sample(); if (delegate instanceof SkippingIterator<?>) { SkippingIterator<? extends T> skippingDelegate = (SkippingIterator<? extends T>) delegate; skippingDelegate.skip(toSkip); if (skippingDelegate.hasNext()) { return skippingDelegate.next(); } } else { for (int i = 0; i < toSkip && delegate.hasNext(); i++) { delegate.next(); } if (delegate.hasNext()) { return delegate.next(); } } return endOfData(); }
@Override public Iterator<T> iterator() { return new SamplingIterator<T>(delegate.iterator(), samplingRate); }
@Override protected T computeNext() { int toSkip = geometricDistribution.sample(); if (delegate instanceof SkippingIterator<?>) { SkippingIterator<? extends T> skippingDelegate = (SkippingIterator<? extends T>) delegate; skippingDelegate.skip(toSkip); if (skippingDelegate.hasNext()) { return skippingDelegate.next(); } } else { for (int i = 0; i < toSkip && delegate.hasNext(); i++) { delegate.next(); } if (delegate.hasNext()) { return delegate.next(); } } return endOfData(); }
@Override public Iterator<T> iterator() { return new SamplingIterator<>(delegate.iterator(), samplingRate); }
@Test public void testSmallInput() { Iterator<Integer> t = new SamplingIterator<Integer>(new CountingIterator(1), 0.9999); assertTrue(t.hasNext()); assertEquals(0, t.next().intValue()); assertFalse(t.hasNext()); }
@Test public void testExactSizeMatch() { Iterator<Integer> t = new SamplingIterator<Integer>(new CountingIterator(10), 1); for (int i = 0; i < 10; i++) { assertTrue(t.hasNext()); assertEquals(i, t.next().intValue()); } assertFalse(t.hasNext()); }
@Test(expected = IllegalArgumentException.class) public void testBadRate1() { new SamplingIterator<Integer>(new CountingIterator(1), 0.0); }
@Test(expected = IllegalArgumentException.class) public void testBadRate2() { new SamplingIterator<Integer>(new CountingIterator(1), 1.1); }
@Test public void testSample() { for (int i = 0; i < 1000; i++) { Iterator<Integer> t = new SamplingIterator<Integer>(new CountingIterator(1000), 0.1); int k = 0; while (t.hasNext()) { int v = t.next(); k++; assertTrue(v >= 0); assertTrue(v < 1000); } double sd = Math.sqrt(0.9 * 0.1 * 1000); assertTrue(k >= 100 - 4 * sd); assertTrue(k <= 100 + 4 * sd); } } }