Class MultidimensionalCounter

java.lang.Object
org.apache.commons.numbers.arrays.MultidimensionalCounter

public final class MultidimensionalCounter extends Object
Converter between unidimensional storage structure and multidimensional conceptual structure. This utility will convert from indices in a multidimensional structure to the corresponding index in a one-dimensional array. For example, assuming that the ranges (in 3 dimensions) of indices are 2, 4 and 3, the following correspondences, between 3-tuples indices and unidimensional indices, will hold:
  • (0, 0, 0) corresponds to 0
  • (0, 0, 1) corresponds to 1
  • (0, 0, 2) corresponds to 2
  • (0, 1, 0) corresponds to 3
  • ...
  • (1, 0, 0) corresponds to 12
  • ...
  • (1, 3, 2) corresponds to 23
  • Field Details

    • dimension

      private final int dimension
      Number of dimensions.
    • uniCounterOffset

      private final int[] uniCounterOffset
      Offset for each dimension.
    • size

      private final int[] size
      Counter sizes.
    • totalSize

      private final int totalSize
      Total number of (one-dimensional) slots.
    • last

      private final int last
      Index of last dimension.
  • Constructor Details

    • MultidimensionalCounter

      private MultidimensionalCounter(int... size)
      Creates a counter.
      Parameters:
      size - Counter sizes (number of slots in each dimension).
      Throws:
      IllegalArgumentException - if one of the sizes is negative or zero.
  • Method Details

    • of

      public static MultidimensionalCounter of(int... size)
      Creates a counter.
      Parameters:
      size - Counter sizes (number of slots in each dimension).
      Returns:
      a new instance.
      Throws:
      IllegalArgumentException - if one of the sizes is negative or zero.
    • getDimension

      public int getDimension()
      Gets the number of dimensions of the multidimensional counter.
      Returns:
      the number of dimensions.
    • toMulti

      public int[] toMulti(int index)
      Converts to a multidimensional counter.
      Parameters:
      index - Index in unidimensional counter.
      Returns:
      the multidimensional counts.
      Throws:
      IndexOutOfBoundsException - if index is not between 0 and the value returned by getSize() (excluded).
    • toUni

      public int toUni(int... c)
      Converts to a unidimensional counter.
      Parameters:
      c - Indices in multidimensional counter.
      Returns:
      the index within the unidimensionl counter.
      Throws:
      IllegalArgumentException - if the size of c does not match the size of the array given in the constructor.
      IndexOutOfBoundsException - if a value of c is not in the range of the corresponding dimension, as defined in the constructor.
    • getSize

      public int getSize()
      Gets the total number of elements.
      Returns:
      the total size of the unidimensional counter.
    • getSizes

      public int[] getSizes()
      Gets the number of multidimensional counter slots in each dimension.
      Returns:
      the number of slots in each dimension.
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • checkStrictlyPositive

      private static void checkStrictlyPositive(String name, int size)
      Check the size is strictly positive: size > 0.
      Parameters:
      name - the name of the size
      size - the size
    • createIndexOutOfBoundsMessage

      private static String createIndexOutOfBoundsMessage(int size, int index)
      Creates the message for the index out of bounds exception.
      Parameters:
      size - the size
      index - the index
      Returns:
      the message