1

我有一个双精度数的 ArrayList,我需要找到所有数字之间的平均值。数组列表中 Double 实例的数量不是恒定的,可能是 2,可能是 90 我已经尝试了几个小时来自己获得算法,但无论如何都无法让它工作。

你有什么建议吗?或者你可以把我链接到一个现有的图书馆来得到这个平均值?

谢谢

4

7 回答 7

5

创建一个sum变量:

double sum = 0;

使用 for 循环遍历列表中的元素:

for (double d : yourList)

在每次迭代中,添加到sum当前值:

    sum += d;

在循环之后,要找到平均值,除以sum列表中的元素数:

double avg = sum / yourList.size();

这是为所有认为这太简单的人准备的...

上面的解决方案其实并不完美。如果列表中的前几个元素非常大而最后一个元素很小,则sum += d由于双精度数的关系,最终可能不会产生影响。

解决方案是在进行平均计算之前对列表进行排序:

Collections.sort(doublesList);

现在将首先添加小元素,以确保尽可能准确地计算它们并为最终总和做出贡献:-)

于 2012-05-09T12:44:12.130 回答
3

如果你喜欢流:

List<Number> list = Arrays.asList(number1, number2, number3, number4);

// calculate the average
double average = list.stream()
                     .mapToDouble(Number::doubleValue)
                     .average()
                     .getAsDouble();
于 2015-09-09T19:23:26.290 回答
1

平均值的定义是所有值的总和除以值的数量。循环遍历这些值,将它们相加,然后将总和除以列表的大小。

于 2012-05-09T12:44:09.667 回答
0

如果您担心将整个列表加在一起时溢出,您可以使用运行平均值。因为它有更多的操作,它会比把所有的东西加在一起然后除一次要慢。

for (int x = 0; x < list.size(); x++)
   average = (average / (x+1)) * (x) + list.get(x) / (x+1);
于 2012-05-09T12:47:39.100 回答
0

如果“所有数字之间的平均值”是指列表中所有双打的平均值,您可以简单地将列表中的所有双打相加(使用循环)并将该总数除以列表中的双打数。

于 2012-05-09T12:44:35.700 回答
0

你有没有尝试过:

List<Double> list = new ArrayList<Double>();
...    
double countTotal = 0;

for (Double number : list)
{
    countTotal += number;
}

double average = countTotal / list.size();
于 2012-05-09T12:45:17.733 回答
0

也许我没有得到这个问题......但它不是这样的吗?

double sum = 0.0;
for (double element : list) {
    sum += element;
}
double average = sum / list.size();
于 2012-05-09T12:45:35.923 回答