diff options
| author | bculkin2442 <bjculkin@mix.wvu.edu> | 2016-09-28 07:54:53 -0400 |
|---|---|---|
| committer | bculkin2442 <bjculkin@mix.wvu.edu> | 2016-09-28 07:54:53 -0400 |
| commit | ba0a3f53a88842a94ea6a1a6d45f61416b593e47 (patch) | |
| tree | 4a528eea60842d5f73bf243653bd6ff7424d153b /BJC-Utils2/src/main/java/bjc/utils/funcutils/ListUtils.java | |
| parent | 387febf2477ce0fab627ef2d163ffbf36741ab0e (diff) | |
Update various things.
Diffstat (limited to 'BJC-Utils2/src/main/java/bjc/utils/funcutils/ListUtils.java')
| -rw-r--r-- | BJC-Utils2/src/main/java/bjc/utils/funcutils/ListUtils.java | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/BJC-Utils2/src/main/java/bjc/utils/funcutils/ListUtils.java b/BJC-Utils2/src/main/java/bjc/utils/funcutils/ListUtils.java index f09a794..d65603b 100644 --- a/BJC-Utils2/src/main/java/bjc/utils/funcutils/ListUtils.java +++ b/BJC-Utils2/src/main/java/bjc/utils/funcutils/ListUtils.java @@ -3,6 +3,7 @@ package bjc.utils.funcutils; import java.util.ArrayList; import java.util.Deque; import java.util.function.Function; +import java.util.function.Supplier; import bjc.utils.data.IHolder; import bjc.utils.data.IPair; @@ -175,6 +176,7 @@ public class ListUtils { * The function to determine the count for each element for * @param numberPerPartition * The number of elements to put in each partition + * * @return A list partitioned according to the above rules */ public static <E> IList<IList<E>> groupPartition(IList<E> input, @@ -294,4 +296,45 @@ public class ListUtils { return returnedList.getValue(); } + + public static <E> IList<E> padList(IList<E> list, + Function<E, Integer> counter, int size, + Supplier<E> padSource) { + IHolder<Integer> countHolder = new Identity<>(0); + + IList<E> ret = list.map((elm) -> { + countHolder.map((val) -> val + counter.apply(elm)); + + return elm; + }); + + if (countHolder.unwrap((val) -> val % size != 0)) { + // We need to pad + int needed = countHolder.unwrap((val) -> val % size); + int threshold = 0; + + while (needed > 0 && threshold <= MAX_NTRIESPART) { + E val = padSource.get(); + int count = counter.apply(val); + + if (count <= needed) { + ret.add(val); + + threshold = 0; + + needed -= count; + } else { + threshold += 1; + } + } + + if (threshold > MAX_NTRIESPART) { + throw new IllegalArgumentException("Heuristic (more than " + + MAX_NTRIESPART + + " iterations of attempting to pad) detected unpaddable list "); + } + } + + return ret; + } }
\ No newline at end of file |
