2012-05-09 24 views
1

我有一個ArrayList的雙打,我需要找到所有數字之間的平均數。 ArrayList中Double實例的數量不是常數,可能是2,可能是90 我一直在嘗試幾個小時才能自己獲取算法,但無法使其工作。查找可變數目內的平均數雙打

你有什麼建議嗎?或者也許你可以將我鏈接到現有的圖書館來獲得這個平均值?

謝謝

回答

0

平均的定義是一切價值的總和,由值數除以。循環查看值,添加它們,並將總和除以列表的大小。通過在列表中的元素使用一個for循環

double sum = 0; 

轉到::

5

創建sum可變

for (double d : yourList) 

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

sum += d; 

循環後,找到平均值,將sum與列表中元素的個數:

double avg = sum/yourList.size(); 

這裏的爲大家認爲這是太簡單了 ...

上述解決方案實際上是不完美的。如果列表中的第一對元素非常大且最後一個元素很小,由於雙精度的原因,sum += d可能不會有所改變。

解決的辦法是做平均計算之前列表進行排序:

Collections.sort(doublesList); 

現在的小元素將被首先添加,這使得確保它們都儘可能準確地計算並有助於最終總和:-)

0

如果通過「所有數字之間的平均數」來表示您的列表中所有雙數的平均值,您可以簡單地將所有雙數添加到列表中(用循環)並將總數除以數字的雙打在你的名單中。

0

您是否嘗試過:

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

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

double average = countTotal/list.size(); 
0

也許我沒有這方面的問題......但它不是這樣呢?

​​
1

如果您在整個列表總結在一起時擔心溢出,則可以使用運行平均值。因爲它有更多的操作,它會比將所有東西加在一起並分割一次慢。

for (int x = 0; x < list.size(); x++) 
    average = (average/(x+1)) * (x) + list.get(x)/(x+1); 
+0

這也是不是很好,當談到精度。 – aioobe

2

如果你喜歡流:

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

// calculate the average 
double average = list.stream() 
        .mapToDouble(Number::doubleValue) 
        .average() 
        .getAsDouble();