package de.invesdwin.util.math.decimal;
import java.util.List;
import javax.annotation.concurrent.Immutable;
/**
* http://stackoverflow.com/questions/11955728/how-to-calculate-the-median-of-an-array
*/
@Immutable
public abstract class ADecimalMedian<E extends ADecimal<E>> {
protected abstract List<E> getSortedList();
public E getMedian() {
final List<E> sortedList = getSortedList();
if (sortedList.isEmpty()) {
return null;
}
if (sortedList.size() == 1) {
return sortedList.get(0);
}
final int middle = sortedList.size() / 2;
final E median;
if (sortedList.size() % 2 == 0) {
final E medianA = sortedList.get(middle);
final E medianB = sortedList.get(middle - 1);
median = medianA.add(medianB).divide(2);
} else {
median = sortedList.get(middle + 1);
}
return median;
}
}