2013-04-05 115 views
0

當我嘗試檢索單個值以找到計算標準偏差過程中的差異時,出現錯誤。我無法弄清楚是否使用.get()或.getValue,我迷路了。我已經計算出了平均值。標準偏差arraylist錯誤

final ArrayList<Map.Entry<String,NumberHolder>> entries = new ArrayList<Map.Entry<String,NumberHolder>>(uaCount.entrySet()); 


for(Map.Entry<String,NumberHolder> entry : entries) //iterating over the sorted hashmap 
{ 

    double temp = 0; 
    double variance = 0; 

    for (int i = 0; i <= entry.getValue().occurrences ; i ++) 
     {    
      temp += ((entry.getValue(i).singleValues) - average)*((entry.getValue(i).singleValues) - average); 

      variance = temp/entry.getValue().occurrences; 
     } 

     double stdDev = Math.sqrt(variance); 

這是我的NumberHolder類,我填充了我的主要功能。我使用該公式中的標準差:http://www.mathsisfun.com/data/standard-deviation-formulas.html

基於我的代碼,出現的是N,並從singleValues值的ArrayList是夕

public static class NumberHolder 
{ 
    public int occurrences = 0; 
    public int sumtime_in_milliseconds = 0; 
    public ArrayList<Long> singleValues = new ArrayList<Long>(); 
} 

這是我的錯誤。 :

The method getValue() in the type Map.Entry<String,series3.NumberHolder> is not applicable for the arguments (int). 

如果你需要看到更多的代碼,請只問,我不想把任何不必要的,但我可能會錯過一些東西。

回答

1

您不能以int作爲Map.Entry#getValue()的參數。所以在你的代碼中應該是entry.getValue()而不是entry.getValue(i)。現在除了這個,你的singleValues是一個ArrayList。所以你不能從(entry.getValue(i).singleValues) - average)行中的整數average中減去它。您必須首先從ArrayList中提取元素,然後從average中減去該元素。您的循環應該是這樣的:

for (int i = 0; i < entry.getValue().occurrences ; i ++)// i < entry.getValue() to avoid IndexOutOfBoundsException 
{    
    temp += ((entry.getValue().singleValues.get(i)) - average)*((entry.getValue().singleValues.get(i)) - average); 
    variance = temp/entry.getValue().occurrences; 
} 
+0

你能解釋一下<而不是<=避免異常嗎? – user2007843 2013-04-05 17:57:44

+0

@ user2007843因爲我猜這種情況是ArrayList的大小(比如說6)。如果你使用'i <= ..',那麼在上一次迭代中,'i'將具有值'6'。但'ArrayList'是'indexed based' dynamic resizable'array',它從'0'開始並以'size() - 1'結尾,即'5'。所以當你試圖在'ArrayList'的'6th'索引處獲取元素時,它會拋出'IndexOutOfBoundsException' – 2013-04-05 18:01:17

+0

好吧,這很有意義,謝謝 – user2007843 2013-04-05 18:02:14

2

錯誤的含義正是它所說的。您不能將int參數傳遞給getValue()

更改entry.getValue(i)entry.getValue()它應該工作正常。

我認爲它就像你想要的entry.getValue().singleValues.get(i)。如果occurrences始終等於entry.getValue().singleValues.size()請考慮清除它。

1

getValue不接受整數參數。您可以使用:

for (int i = 0; i < entry.getValue().singleValues.size(); i++) { 
    Long singleValue = entry.getValue().singleValues.get(i); 
    temp += (singleValue - average) * (singleValue - average); 

    variance = temp/entry.getValue().occurrences; 
} 

而且ArrayLists是從零開始,所以你應該size - 1結束。

+0

對不起,我應該在OP已經把這一點,但是這是當我試過了'操作錯誤 - 未定義的參數類型的ArrayList ' – user2007843 2013-04-05 17:39:27

+0

您需要從'singleValues'' ArrayList'中提取一個數值來做一個計算,儘管 – Reimeus 2013-04-05 17:42:58

+1

可能希望將'.singleValues(i)'更改爲'.singleValues.get(i)'。 – Avi 2013-04-05 17:43:44