/****************************************************************************** * Name: Reference * NetID: ref * Precept: P00 * * Description: Computes the rolling mean and max of a sequence * of floating-point numbers, with window size k. ******************************************************************************/ public class RollingStats { private final int k; // window size private int n; // number of data values private Queue history; // last k data values private double sum; // sum of all data values // creates a new object with window length k public RollingStats(int k) { this.k = k; history = new Queue(); } // adds the data value x to the data structure public void add(double x) { if (n >= k) { history.dequeue(); } sum += x; n++; history.enqueue(x); } // returns the rolling mean public double rollingMean() { if (n <= k) return mean(); double queueSum = 0.0; for (double x : history) queueSum += x; return queueSum / k; } // returns the overall mean public double mean() { return sum / n; } // unit tests this data type public static void main(String[] args) { int k = Integer.parseInt(args[0]); RollingStats stats = new RollingStats(k); while (!StdIn.isEmpty()) { double x = StdIn.readDouble(); stats.add(x); StdOut.printf("%.2f %.2f\n", stats.mean(), stats.rollingMean()); } } }