diff options
Diffstat (limited to 'spark-common/src/main/java/me/lucko/spark/common/util')
-rw-r--r-- | spark-common/src/main/java/me/lucko/spark/common/util/RollingAverage.java | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/spark-common/src/main/java/me/lucko/spark/common/util/RollingAverage.java b/spark-common/src/main/java/me/lucko/spark/common/util/RollingAverage.java index 5cf5bb5..1e5e8b2 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/util/RollingAverage.java +++ b/spark-common/src/main/java/me/lucko/spark/common/util/RollingAverage.java @@ -23,6 +23,8 @@ package me.lucko.spark.common.util; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.List; import java.util.Queue; public class RollingAverage { @@ -79,4 +81,26 @@ public class RollingAverage { } } + public double getMedian() { + return getPercentile(50); + } + + public double getPercentile(int percentile) { + if (percentile < 0 || percentile > 100) { + throw new IllegalArgumentException("Invalid percentage " + percentile); + } + + List<BigDecimal> sortedSamples; + synchronized (this) { + if (this.samples.isEmpty()) { + return 0; + } + sortedSamples = new ArrayList<>(this.samples); + } + sortedSamples.sort(null); + + int rank = (int) Math.ceil((percentile / 100d) * sortedSamples.size()); + return sortedSamples.get(rank).doubleValue(); + } + } |