package org.squidy.nodes.optitrack.intercept;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import javax.vecmath.Point2d;
public class StatisticQueue extends LinkedList<Double> {
private int size;
public StatisticQueue(int size)
{
super();
this.size = size;
}
public LinkedList<Double> winsorize(double percentage)
{
LinkedList<Double> tmpList = (LinkedList<Double>) this.clone();
LinkedList<Double> outList = (LinkedList<Double>) this.clone();
Collections.sort(tmpList);
int threshold = (int) Math.floor(percentage * outList.size());
for (int i = 0; i < threshold; i++)
{
outList.remove(tmpList.getFirst());
outList.remove(tmpList.getLast());
}
return outList;
}
public double getAverage(int reverseElementCount, double winsorizePercentage)
{
LinkedList<Double> outList;
if (winsorizePercentage > 0)
outList = this.winsorize(winsorizePercentage);
else
outList = (LinkedList<Double>) this.clone();
if (reverseElementCount == 0)
{
reverseElementCount = outList.size();
Collections.reverse(outList);
}
java.util.Iterator<Double> itr = outList.iterator();
int counter = 0;
double avg = 0;
while (itr.hasNext())
{
if (counter++ > reverseElementCount)
break;
avg += itr.next();
}
return (avg / reverseElementCount);
}
public double getSum(int reverseElementCount, double winsorizePercentage)
{
LinkedList<Double> outList;
if (winsorizePercentage > 0)
outList = this.winsorize(winsorizePercentage);
else
outList = (LinkedList<Double>) this.clone();
if (reverseElementCount == 0)
{
reverseElementCount = outList.size();
Collections.reverse(outList);
}
Iterator<Double> itr = (Iterator<Double>) outList.iterator();
int counter = 0;
double sum = 0;
while (itr.hasNext())
{
if (counter++ > reverseElementCount)
break;
sum += itr.next();
}
return sum;
}
public boolean add(double e) {
boolean retBool = super.add(e);
if (retBool)
{
if (this.size() > this.size)
this.poll();
}
return retBool;
}
}