2013-04-05 7 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 является Xi

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. поэтому вы не можете вычесть его из целого числа average в строке (entry.getValue(i).singleValues) - 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

+0

@ user2007843 Потому что я предполагаю, что вхождения - это размер вашего ArrayList (скажем, 6). Если вы используете 'i <= ..', то в последней итерации 'i' будет иметь значение' 6'. Но 'ArrayList' является' индексированным на основе 'динамическим resizable' array', который начинается с '0' и заканчивается' size() - 1', который равен '5'. Поэтому, когда вы пытаетесь получить элемент в индексе '6th'' ArrayList', он выкинет «IndexOutOfBoundsException» –

+0

в порядке, спасибо, спасибо – user2007843

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

жаль, что я должен был сделать это в ОП, но это ошибка, когда я попытался что 'Оператор - не определен для типа аргумента (ов) ArrayList ' – user2007843

+0

Вам нужно будет извлечь числовое значение из 'SingleValues'' ArrayList', чтобы выполнить вычисление, но – Reimeus

+1

Возможно, захотите изменить '.singleValues ​​(i)' на '.singleValues.get (i)'. – Avi

Смежные вопросы