public Calculation(final C[] catagories, final Operation... operations) { if (catagories == null) { throw new NullPointerException("categories.not.specified"); } if (operations == null || operations.length == 0) { throw new NullPointerException("operations.not.specified"); } this.catagories = Arrays.copyOf(catagories, catagories.length); for (final Operation operation : operations) { this.operations[operation.ordinal()] = operation; } if (this.operations[Operation.SUM.ordinal()] != null || this.operations[Operation.AVERAGE.ordinal()] != null) { sum = new BigDecimal[catagories.length]; final BigDecimal zero = new BigDecimal(0); for (int i = 0; i < catagories.length; i++) { sum[i] = zero; } } if (this.operations[Operation.AVERAGE.ordinal()] != null) { count = new long[catagories.length]; } if (this.operations[Operation.MEDIAN.ordinal()] != null) { values = new List[catagories.length]; for (int i = 0; i < catagories.length; i++) { values[i] = new ArrayList<BigDecimal>(); } } }
public void registerValue(final C catagory, final BigDecimal value) { final int index = getIndex(catagory); if (operations[Operation.AVERAGE.ordinal()] != null) { count[index]++; sum[index] = sum[index].add(value); } else if (operations[Operation.SUM.ordinal()] != null) { sum[index] = sum[index].add(value); } if (operations[Operation.MEDIAN.ordinal()] != null) { values[index].add(value); } }