67 lines
1.5 KiB
Java
67 lines
1.5 KiB
Java
package patternmatching;
|
|
|
|
import java.util.Arrays;
|
|
import java.util.stream.Collectors;
|
|
|
|
public final class Statistics {
|
|
|
|
private final long[] data;
|
|
private Double mean = null;
|
|
private Double variance = null;
|
|
|
|
private Statistics(long[] data) {
|
|
this.data = data;
|
|
}
|
|
|
|
private double getMean() {
|
|
if (mean == null) {
|
|
mean = (double) Arrays.stream(data).sum() / data.length;
|
|
}
|
|
|
|
return mean;
|
|
}
|
|
|
|
private double getVariance() {
|
|
if (variance == null) {
|
|
final double mean = getMean();
|
|
double temp = 0;
|
|
for(double a : data) {
|
|
temp += (a-mean)*(a-mean);
|
|
}
|
|
variance = temp/(data.length-1);
|
|
}
|
|
|
|
return variance;
|
|
}
|
|
|
|
private double getStddev() {
|
|
return Math.sqrt(getVariance());
|
|
}
|
|
|
|
private double getMedian() {
|
|
Arrays.sort(data);
|
|
if (data.length % 2 == 0) return (data[(data.length / 2) - 1] + data[data.length / 2]) / 2.0;
|
|
return data[data.length / 2];
|
|
}
|
|
|
|
static Statistics from(long[] data) {
|
|
return new Statistics(data);
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return String.format(
|
|
"mean=%.2fms stddev=%.2fms median=%.2fms",
|
|
getMean()/1000,
|
|
getStddev()/1000,
|
|
getMedian()/1000
|
|
);
|
|
}
|
|
|
|
String asCSv() {
|
|
return Arrays.stream(data)
|
|
.mapToObj(String::valueOf)
|
|
.collect(Collectors.joining(","));
|
|
}
|
|
}
|