在Java中,通过设置计时器,我每秒收到一个数字。如何获得计时器中所有数字的平均值的好方法。
我不希望每秒平均,我希望平均总计10秒。
我建议以下算法仅需要两个变量(标记为粗体):
每次收到新元素时,
此方法避免了对集合中的所有元素进行迭代,在有大量元素的情况下,我可以安全地使用一些时间。
public class AvgCalculator {
private double avg = 0.0f;
private int cnt = 0;
/**
* Calculates a new average based on the current one and
* a specified new value. After calling this method avg
* holds the new average value;
*
* @return the new average
*/
public double calcNewAvg(final int newValue) {
return avg = ((avg * cnt) + newValue) / ++cnt;
}
/**
* Resets the average and count to zero
*/
public void resetAvg() {
avg = 0.0f;
cnt = 0;
}
public double getAvg() {
return avg;
}
}
如何使用:
final AvgCalculator avgCalc = new AvgCalculator();
avgCalc.calcNewAvg(1);
avgCalc.calcNewAvg(3);
avgCalc.calcNewAvg(1);
avgCalc.calcNewAvg(3);
System.out.println(avgCalc.getAvg); // should print 2 (1+3+1+3 = 8 8/4 = 2)
avgCalc.resetAvg();
System.out.println(calcNewAvg(5)); // should print 5 (5/1 = 5)
System.out.println(calcNewAvg(15)); // should print 10 (5+15 = 20 20/2 = 10)
输出:
2.0
5.0
10.0
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句