Skip to content

Commit 461ff53

Browse files
Szkocsovszkijavadev
authored andcommitted
Add U.takeSkipping(iterable, stepSize) method.
1 parent cc8b1e6 commit 461ff53

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

src/main/java/com/github/underscore/U.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2960,6 +2960,10 @@ public Chain<List<T>> splitAt(final int position) {
29602960
return new Chain<List<T>>(U.splitAt(list, position));
29612961
}
29622962

2963+
public Chain<T> takeSkipping(final int stepSize) {
2964+
return new Chain<T>(U.takeSkipping(list, stepSize));
2965+
}
2966+
29632967
public Chain<T> reverse() {
29642968
return new Chain<T>(U.reverse(list));
29652969
}
@@ -3274,6 +3278,33 @@ public List<List<T>> splitAt(final int position) {
32743278
return splitAt(iterable, position);
32753279
}
32763280

3281+
public static <T> List<T> takeSkipping(final Iterable<T> iterable, final int stepSize) {
3282+
List<T> result = newArrayList();
3283+
if (stepSize <= 0) {
3284+
return result;
3285+
}
3286+
int size = size(iterable);
3287+
if (stepSize > size) {
3288+
result.add(first(iterable));
3289+
return result;
3290+
}
3291+
int i = 0;
3292+
for (T element : iterable) {
3293+
if (i++ % stepSize == 0) {
3294+
result.add(element);
3295+
}
3296+
}
3297+
return result;
3298+
}
3299+
3300+
public static <T> List<T> takeSkipping(final T[] array, final int stepSize) {
3301+
return takeSkipping(Arrays.asList(array), stepSize);
3302+
}
3303+
3304+
public List<T> takeSkipping(final int stepSize) {
3305+
return takeSkipping(iterable, stepSize);
3306+
}
3307+
32773308
/*
32783309
* Documented, #reverse
32793310
*/

src/test/java/com/github/underscore/UnderscoreTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,29 @@ public void splitAt() {
215215
assertEquals("[[0, 1], [2, 3, 4]]", U.splitAt(array, 2).toString());
216216
}
217217

218+
/*
219+
_.takeSkipping([1, 2, 3, 4, 5], 2);
220+
=> [0, 2, 4]
221+
_.takeSkipping([1, 2, 3, 4, 5], 100000);
222+
=> [0]
223+
_.takeSkipping([1, 2, 3, 4, 5], -100);
224+
=> []
225+
*/
226+
@Test
227+
public void takeSkipping() {
228+
assertEquals("[0, 2, 4]", U.takeSkipping(U.newIntegerList(U.range(5)), 2).toString());
229+
assertEquals("[0]", U.takeSkipping(U.newIntegerList(U.range(5)), 100000).toString());
230+
assertEquals("[]", U.takeSkipping(U.newIntegerList(U.range(5)), -100).toString());
231+
assertEquals("[]", U.takeSkipping(U.newIntegerList(U.range(5)), 0).toString());
232+
assertEquals("[0, 2, 4]", new U<Integer>(U.newIntegerList(U.range(5))).takeSkipping(2).toString());
233+
assertEquals("[0, 2, 4]", U.chain(U.newIntegerList(U.range(5))).takeSkipping(2).value().toString());
234+
assertEquals("[a, c, e]", U.takeSkipping(asList('a', 'b', 'c', 'd', 'e'), 2).toString());
235+
assertEquals("[ant, camel, elephant]", U.takeSkipping(asList("ant", "bird", "camel", "dog", "elephant"), 2).toString());
236+
assertEquals("[0.1, 0.3, 0.5]", U.takeSkipping(asList(0.1, 0.2, 0.3, 0.4, 0.5), 2).toString());
237+
final Integer[] array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
238+
assertEquals("[0, 3, 6, 9]", U.takeSkipping(array, 3).toString());
239+
}
240+
218241
/*
219242
var arr = [ 1, 2, 3 ]
220243
_.copyOf(arr) // => [1, 2, 3]

0 commit comments

Comments
 (0)