2015-06-12 30 views
2

我有一個void方法,它接受一個整數,以便它可以將存儲在類對象中的值更新爲平均值。這裏的自負是每次我調用這個方法時,它必須更新方法中存儲的和,然後重新平均它。問題是前兩個JUnit測試我運行檢查一個和兩個調用工作正常,但第三個錯誤計算。我確信這是因爲它只是取第三個值並將其加到先前的平均值而不是總和中,但我不確定如何調和這一點並完全陷入困境。有沒有更合適的方法來做到這一點,而不是將參數傳遞給ArrayList?因爲我很新,所以我可能會錯過一些明顯的東西。如何使用void方法和重複的方法調用來計算平均值?

public void getAverage(int value) { 
    ArrayList<Integer> valueList = new valueList<Integer>(); 
    valueList.add(value); 
    int sum = this.mean; //instance variable that must hold average 
    for (int val : valueList) { 
     sum += val; 
     this.mean = sum; 
     this.numValues++; //instance variable for how many entries 
    } 
    sum = this.mean/this.numValues; 
    this.mean = sum; 


} 
+0

快速照顧你可能只是將'this.mean'設置爲由this.numValues分割。你也可以在每個方法調用上創建一個新的'ArrayList',也許是本地化的? –

+0

是的,這是一個相當混亂。沒有填補陣列可能的誤報可能沒有幫助。使valueList成爲一個實例變量,併爲每個變量固定冗餘。也刪除了numValues,我只是將值除以valueList.size(),因爲它看起來更簡潔。謝謝,所有! – jt90133

回答

2

這是因爲你valueList是一個局部變量,並在新的每個方法調用創建的,因此它僅保留1個值,這是你的value,而不是以前的所有方法調用的值。

要修復,請將您的valueList作爲實例變量移動到類中。

+0

啊。輝煌。即使在使用System.out.println(valueList.size())測試打印重複1之後,我也不敢相信我錯過了。猜猜你有時需要一些其他的眼睛... – jt90133

0

您創建一個新的ArrayList每個方法調用。放在類內部,這樣在方法返回時不會被刪除。

0

一旦你的列表移動到它應該是,你可以得到的平均值作爲雙任何時候,你一個新的值由使用流在Java中8添加到它:

mean = valueList.stream().mapToInt(Integer::intValue).summaryStatistics().getAverage();