我有一個ArrayList的雙打,我需要找到所有數字之間的平均數。 ArrayList中Double實例的數量不是常數,可能是2,可能是90 我一直在嘗試幾個小時才能自己獲取算法,但無法使其工作。查找可變數目內的平均數雙打
你有什麼建議嗎?或者也許你可以將我鏈接到現有的圖書館來獲得這個平均值?
謝謝
我有一個ArrayList的雙打,我需要找到所有數字之間的平均數。 ArrayList中Double實例的數量不是常數,可能是2,可能是90 我一直在嘗試幾個小時才能自己獲取算法,但無法使其工作。查找可變數目內的平均數雙打
你有什麼建議嗎?或者也許你可以將我鏈接到現有的圖書館來獲得這個平均值?
謝謝
平均的定義是一切價值的總和,由值數除以。循環查看值,添加它們,並將總和除以列表的大小。通過在列表中的元素使用一個for循環
double sum = 0;
轉到::
創建sum
可變
for (double d : yourList)
在每次迭代中,添加到sum
的當前值:
sum += d;
循環後,找到平均值,將sum
與列表中元素的個數:
double avg = sum/yourList.size();
這裏的爲大家認爲這是太簡單了 ...
上述解決方案實際上是不完美的。如果列表中的第一對元素非常大且最後一個元素很小,由於雙精度的原因,sum += d
可能不會有所改變。
解決的辦法是做平均計算之前列表進行排序:
Collections.sort(doublesList);
現在的小元素將被首先添加,這使得確保它們都儘可能準確地計算並有助於最終總和:-)
如果通過「所有數字之間的平均數」來表示您的列表中所有雙數的平均值,您可以簡單地將所有雙數添加到列表中(用循環)並將總數除以數字的雙打在你的名單中。
您是否嘗試過:
List<Double> list = new ArrayList<Double>();
...
double countTotal = 0;
for (Double number : list)
{
countTotal += number;
}
double average = countTotal/list.size();
也許我沒有這方面的問題......但它不是這樣呢?
如果您在整個列表總結在一起時擔心溢出,則可以使用運行平均值。因爲它有更多的操作,它會比將所有東西加在一起並分割一次慢。
for (int x = 0; x < list.size(); x++)
average = (average/(x+1)) * (x) + list.get(x)/(x+1);
如果你喜歡流:
List<Number> list = Arrays.asList(number1, number2, number3, number4);
// calculate the average
double average = list.stream()
.mapToDouble(Number::doubleValue)
.average()
.getAsDouble();
這也是不是很好,當談到精度。 – aioobe