一组数字的平均值

时间:2014-09-14 22:56:58

标签: java arrays timer numbers

在Java中,使用我设置的计时器,我每秒收到一个数字。什么是获得计时器中所有数字的平均值的好方法。

我不希望平均每秒,我想要一个总平均值,比如10秒。

2 个答案:

答案 0 :(得分:1)

我建议使用以下算法,只需要两个变量(标记为粗体):

每次收到新元素时,

  • 将当前平均值乘以计数
  • 将新值添加到结果中(现在您有旧的总和)
  • 计数增加一个(因为我们现在还有一个元素)
  • 最后进行总和/计数计算并将结果保存在 avg 变量中。

这个方法避免迭代你的集合中的所有元素,在大量元素的情况下,我保证你的安全。

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

答案 1 :(得分:0)

使用链接列表并在输入时将输入的数字添加到LinkedList中。然后只需使用for循环来获取LinkedList的总和,并将其除以LinkedList.size()