aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Tardieu <sam@rfc1149.net>2014-04-13 21:21:06 +0200
committerSamuel Tardieu <sam@rfc1149.net>2014-04-13 21:21:06 +0200
commit8cd9b2afb2f620bb3c2a0df565f8d9ff483fcfaf (patch)
treeb20d5077c0d5ab8e801fc3908ef8c0943366a36c
parente1832f8943f53a50dd6cd50482753779e12cd31a (diff)
downloadcgeo-8cd9b2afb2f620bb3c2a0df565f8d9ff483fcfaf.zip
cgeo-8cd9b2afb2f620bb3c2a0df565f8d9ff483fcfaf.tar.gz
cgeo-8cd9b2afb2f620bb3c2a0df565f8d9ff483fcfaf.tar.bz2
buffer lets you split a list into smaller max-size ones
-rw-r--r--main/src/cgeo/geocaching/utils/MiscUtils.java40
-rw-r--r--tests/src/cgeo/geocaching/utils/MiscUtilsTest.java54
2 files changed, 94 insertions, 0 deletions
diff --git a/main/src/cgeo/geocaching/utils/MiscUtils.java b/main/src/cgeo/geocaching/utils/MiscUtils.java
new file mode 100644
index 0000000..122c4eb
--- /dev/null
+++ b/main/src/cgeo/geocaching/utils/MiscUtils.java
@@ -0,0 +1,40 @@
+package cgeo.geocaching.utils;
+
+import org.apache.commons.collections4.iterators.IteratorIterable;
+import org.apache.commons.lang3.NotImplementedException;
+
+import java.util.Iterator;
+import java.util.List;
+
+final public class MiscUtils {
+
+ private MiscUtils() {} // Do not instantiate
+
+ public static <T> Iterable<List<T>> buffer(final List<T> original, final int n) {
+ if (n <= 0) {
+ throw new IllegalArgumentException("buffer size must be positive");
+ }
+ return new IteratorIterable<List<T>>(new Iterator<List<T>>() {
+ final int size = original.size();
+ int next = 0;
+
+ @Override
+ public boolean hasNext() {
+ return next < size;
+ }
+
+ @Override
+ public List<T> next() {
+ final List<T> result = original.subList(next, Math.min(next + n, size));
+ next += n;
+ return result;
+ }
+
+ @Override
+ public void remove() {
+ throw new NotImplementedException("remove");
+ }
+ });
+ }
+
+}
diff --git a/tests/src/cgeo/geocaching/utils/MiscUtilsTest.java b/tests/src/cgeo/geocaching/utils/MiscUtilsTest.java
new file mode 100644
index 0000000..2ee99c4
--- /dev/null
+++ b/tests/src/cgeo/geocaching/utils/MiscUtilsTest.java
@@ -0,0 +1,54 @@
+package cgeo.geocaching.utils;
+
+import junit.framework.TestCase;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class MiscUtilsTest extends TestCase {
+
+ public static void testBufferEmpty() {
+ for (final List<String> s: MiscUtils.buffer(new LinkedList<String>(), 10)) {
+ fail("empty collection should not iterate");
+ }
+ }
+
+ public static void testMultiple() {
+ final List<Integer> list = new LinkedList<Integer>();
+ for (int i = 0; i < 50; i++) {
+ list.add(i);
+ }
+ int count = 0;
+ for (final List<Integer> subList: MiscUtils.buffer(list, 10)) {
+ assertEquals("each sublist has the right size", 10, subList.size());
+ assertEquals("sublist has the right content", count * 10, (int) subList.get(0));
+ count++;
+ }
+ assertEquals("there are the right number of sublists", 5, count);
+ }
+
+ public static void testNonMultiple() {
+ final List<Integer> list = new LinkedList<Integer>();
+ for (int i = 0; i < 48; i++) {
+ list.add(i);
+ }
+ int count = 0;
+ for (final List<Integer> subList: MiscUtils.buffer(list, 10)) {
+ assertTrue("each sublist has no more than the allowed number of arguments", subList.size() <= 10);
+ count += subList.size();
+ }
+ assertEquals("all the elements were seen", 48, count);
+ }
+
+ public static void testArguments() {
+ try {
+ MiscUtils.buffer(new LinkedList<Integer>(), 0);
+ fail("an exception should be raised");
+ } catch (final IllegalArgumentException e) {
+ // Ok
+ } catch (final Exception e) {
+ fail("bad exception raised: " + e);
+ }
+ }
+
+}