diff options
Diffstat (limited to 'base/src/main/java/bjc/utils/funcutils/ListUtils.java')
| -rw-r--r-- | base/src/main/java/bjc/utils/funcutils/ListUtils.java | 126 |
1 files changed, 60 insertions, 66 deletions
diff --git a/base/src/main/java/bjc/utils/funcutils/ListUtils.java b/base/src/main/java/bjc/utils/funcutils/ListUtils.java index 2441a80..20ae7b2 100644 --- a/base/src/main/java/bjc/utils/funcutils/ListUtils.java +++ b/base/src/main/java/bjc/utils/funcutils/ListUtils.java @@ -23,13 +23,12 @@ public class ListUtils { * spaces. * * @param input - * The list of tokens to collapse. + * The list of tokens to collapse. * - * @return - * The collapsed string of tokens. + * @return The collapsed string of tokens. */ public static String collapseTokens(final IList<String> input) { - if (input == null) throw new NullPointerException("Input must not be null"); + if(input == null) throw new NullPointerException("Input must not be null"); return collapseTokens(input, ""); } @@ -39,33 +38,32 @@ public class ListUtils { * separator after each token. * * @param input - * The list of tokens to collapse. + * The list of tokens to collapse. * * @param seperator - * The separator to use for separating tokens. + * The separator to use for separating tokens. * - * @return - * The collapsed string of tokens. + * @return The collapsed string of tokens. */ public static String collapseTokens(final IList<String> input, final String seperator) { - if (input == null) { + if(input == null) { throw new NullPointerException("Input must not be null"); - } else if (seperator == null) { + } else if(seperator == null) { throw new NullPointerException("Seperator must not be null"); } - if (input.getSize() < 1) { + if(input.getSize() < 1) { return ""; - } else if (input.getSize() == 1) { + } else if(input.getSize() == 1) { return input.first(); } else { final StringBuilder state = new StringBuilder(); int i = 1; - for (final String itm : input.toIterable()) { + for(final String itm : input.toIterable()) { state.append(itm); - if (i != input.getSize()) { + if(i != input.getSize()) { state.append(seperator); } @@ -80,21 +78,20 @@ public class ListUtils { * Select a number of random items from the list without replacement. * * @param <E> - * The type of items to select. + * The type of items to select. * * @param list - * The list to select from. + * The list to select from. * * @param number - * The number of items to selet. + * The number of items to selet. * * @param rng - * A function that creates a random number from 0 to the - * desired number. + * A function that creates a random number from 0 to the desired + * number. * - * @return - * A new list containing the desired number of items randomly - * selected from the specified list without replacement. + * @return A new list containing the desired number of items randomly + * selected from the specified list without replacement. */ public static <E> IList<E> drawWithoutReplacement(final IList<E> list, final int number, final Function<Integer, Integer> rng) { @@ -105,7 +102,7 @@ public class ListUtils { final Iterator<E> itr = list.toIterable().iterator(); E element = null; - for (final int index = 0; itr.hasNext(); element = itr.next()) { + for(final int index = 0; itr.hasNext(); element = itr.next()) { /* n - m */ final int winningChance = number - selected.getSize(); @@ -113,7 +110,7 @@ public class ListUtils { final int totalChance = total - (index - 1); /* Probability of selecting the t+1'th element */ - if (NumberUtils.isProbable(winningChance, totalChance, rng)) { + if(NumberUtils.isProbable(winningChance, totalChance, rng)) { selected.add(element); } } @@ -125,27 +122,26 @@ public class ListUtils { * Select a number of random items from the list, with replacement. * * @param <E> - * The type of items to select. + * The type of items to select. * * @param list - * The list to select from. + * The list to select from. * * @param number - * The number of items to select. + * The number of items to select. * * @param rng - * A function that creates a random number from 0 to the - * desired number. + * A function that creates a random number from 0 to the desired + * number. * - * @return - * A new list containing the desired number of items randomly - * selected from the specified list. + * @return A new list containing the desired number of items randomly + * selected from the specified list. */ public static <E> IList<E> drawWithReplacement(final IList<E> list, final int number, final Function<Integer, Integer> rng) { final IList<E> selected = new FunctionalList<>(new ArrayList<>(number)); - for (int i = 0; i < number; i++) { + for(int i = 0; i < number; i++) { selected.add(list.randItem(rng)); } @@ -157,27 +153,26 @@ public class ListUtils { * for more than one element in a partition. * * @param <E> - * The type of elements in the list to partition. + * The type of elements in the list to partition. * * @param input - * The list to partition. + * The list to partition. * * @param counter - * The function to determine the count for each element for. + * The function to determine the count for each element for. * * @param partitionSize - * The number of elements to put in each partition. + * The number of elements to put in each partition. * - * @return - * A list partitioned according to the above rules. + * @return A list partitioned according to the above rules. */ public static <E> IList<IList<E>> groupPartition(final IList<E> input, final Function<E, Integer> counter, final int partitionSize) { - if (input == null) { + if(input == null) { throw new NullPointerException("Input list must not be null"); - } else if (counter == null) { + } else if(counter == null) { throw new NullPointerException("Counter must not be null"); - } else if (partitionSize < 1 || partitionSize > input.getSize()) { + } else if(partitionSize < 1 || partitionSize > input.getSize()) { final String fmt = "%d is not a valid partition size. Must be between 1 and %d"; final String msg = String.format(fmt, partitionSize, input.getSize()); @@ -193,20 +188,20 @@ public class ListUtils { final GroupPartIteration<E> it = new GroupPartIteration<>(returned, rejected, partitionSize, counter); /* Run up to a certain number of passes. */ - for (int numberOfIterations = 0; numberOfIterations < MAX_NTRIESPART + for(int numberOfIterations = 0; numberOfIterations < MAX_NTRIESPART && !rejected.isEmpty(); numberOfIterations++) { input.forEach(it); - if (rejected.isEmpty()) { + if(rejected.isEmpty()) { /* Nothing was rejected, so we're done. */ return returned; } } - final String fmt = "Heuristic (more than %d iterations of partitioning) detected an unpartitionable list. (%s)\nThe following elements were not partitioned: %s\nCurrent group in formation: %s\nPreviously formed groups: %s\n"; - final String msg = String.format(fmt, MAX_NTRIESPART, input.toString(), rejected.toString(), it.currentPartition.toString(), returned.toString()); + final String msg = String.format(fmt, MAX_NTRIESPART, input.toString(), rejected.toString(), + it.currentPartition.toString(), returned.toString()); throw new IllegalArgumentException(msg); } @@ -215,20 +210,19 @@ public class ListUtils { * Merge the contents of a bunch of lists together into a single list. * * @param <E> - * The type of value in this lists. + * The type of value in this lists. * * @param lists - * The values in the lists to merge. + * The values in the lists to merge. * - * @return - * A list containing all the elements of the lists. + * @return A list containing all the elements of the lists. */ @SafeVarargs public static <E> IList<E> mergeLists(final IList<E>... lists) { final IList<E> returned = new FunctionalList<>(); - for (final IList<E> list : lists) { - for (final E itm : list.toIterable()) { + for(final IList<E> list : lists) { + for(final E itm : list.toIterable()) { returned.add(itm); } } @@ -240,25 +234,24 @@ public class ListUtils { * Pad the provided list out to the desired size. * * @param <E> - * The type of elements in the list. + * The type of elements in the list. * * @param list - * The list to pad out. + * The list to pad out. * * @param counter - * The function to count elements with. + * The function to count elements with. * * @param size - * The desired size of the list. + * The desired size of the list. * * @param padder - * The function to get elements to pad with. + * The function to get elements to pad with. * - * @return - * The list, padded to the desired size. + * @return The list, padded to the desired size. * * @throws IllegalArgumentException - * If the list couldn't be padded to the desired size. + * If the list couldn't be padded to the desired size. */ public static <E> IList<E> padList(final IList<E> list, final Function<E, Integer> counter, final int size, final Supplier<E> padder) { @@ -266,22 +259,22 @@ public class ListUtils { final IList<E> returned = new FunctionalList<>(); - for (final E itm : list.toIterable()) { + for(final E itm : list.toIterable()) { count += counter.apply(itm); returned.add(itm); } - if (count % size != 0) { + if(count % size != 0) { /* We need to pad */ int needed = count % size; int threshold = 0; - while (needed > 0 && threshold <= MAX_NTRIESPART) { + while(needed > 0 && threshold <= MAX_NTRIESPART) { final E val = padder.get(); final int newCount = counter.apply(val); - if (newCount <= needed) { + if(newCount <= needed) { returned.add(val); threshold = 0; @@ -292,10 +285,11 @@ public class ListUtils { } } - if (threshold > MAX_NTRIESPART) { + if(threshold > MAX_NTRIESPART) { final String fmt = "Heuristic (more than %d iterations of attempting to pad) detected an unpaddable list. (%s)\nPartially padded list: %S"; - final String msg = String.format(fmt, MAX_NTRIESPART, list.toString(), returned.toString()); + final String msg = String.format(fmt, MAX_NTRIESPART, list.toString(), + returned.toString()); throw new IllegalArgumentException(msg); } |
