2015-02-24 2 views
0

Я пробовал написать этот код, чтобы проверить свою идею о том, как рассчитать среднее значение по таким же индексам хэш-карты.
т. Е. Для каждого массива, содержащегося внутри хэш-карты, если первое значение для первого массива было 2, а первое значение для второго массива было 4, а первое значение для третьего массива было 3, я хочу присвоить значение (4 + 3 + 2/3) = 3 в последний двойной массив [] для первого индекса и т. Д. Для всех индексов от 2 до n.вычислить среднее значение через знаки хэш-карты

int Size = 3; 

    double[] AVERAGED_WEIGHTS = new double[Size]; 

    //store weights to be averaged. 
    Map<Integer,double[]> cached_weights = new HashMap<Integer,double[]>(); 

    double[] weights = new double[Size]; 

    int iteration = 0; 
    do 
    { 
     weights[iteration] = Math.floor(Math.random() * 10000)/10000; 

     iteration++; 

     //store weights for averaging 
     cached_weights.put(iteration , weights); 
    } 
    while (iteration < Size); 

    //calc averages 
    for (Entry<Integer, double[]> entry : cached_weights.entrySet()) 
    { 
     int key = entry.getKey(); 
     double[] value = entry.getValue(); 
     AVERAGED_WEIGHTS[ key - 1 ] += value[ key - 1 ]; 

     if (key == iteration) 
     { 
      AVERAGED_WEIGHTS[ key - 1 ] /= key; 
     } 
    } 
    for(int i = 0; i < weights.length; i++) 
    { 
     weights[i] = AVERAGED_WEIGHTS[i]; 
    } 

Это напоминает структуру исходной программы, в которой веса заполняются через цикл while. Этот код не работает и не выполняет операцию, описанную выше. Я искал в Интернете и пытался по-разному исправить это, но я не смог его решить. Возможно, кто-то может обнаружить мою ошибочную логику.

+1

Ваш код имеет так много недостатков. 'AVERAGED_WEIGHTS [ключ-1] + = значение [ключ-1]; ', а также в условии, что вы находитесь с ключом, но не сохраняете нигде. и почему вы использовали последний цикл? – Prashant

+0

dig [this one] (http://stackoverflow.com/questions/28688007/take-the-average-of-each-index-in-a-double-hash-map-and-assign-it-to-an -output) это более полное описание того, что я пытаюсь сделать –

+0

@Prashant согласны ли вы с тем, что ответ Даниила правильный? –

ответ

5

Возможно, я вас неправильно понял, но вы не вычисляете среднее значение, потому что для каждого массива на вашей карте вы не учитываете все его позиции. Вы используете ключ, и это абсолютно не имеет смысла. В любом случае, ваш код очень запутан. То, что вам нужно сделать, это просто одна петля внутри другой. Один идет через массивы, а другой проходит через элементы каждого массива. Способом вычисления среднего является следующее (по-дидактически):

//compute averages 
double[] sums = new double[size]; 
double[] averages = new double[size]; 

for (Entry<Integer, double[]> entry : cachedWeights.entrySet()) { 
    double[] value = entry.getValue(); 
    for(int pos=0; pos < Math.min(size, value.length); pos++){ 
     sums[pos] += value[pos]; 
    } 
} 
for(int pos=0; pos < size; pos++){ 
    averages[pos] = sums[pos]/cachedWeights.size(); 
} 
+0

Будет ли это применимо к [этому приложению] (http://stackoverflow.com/questions/28688007/take-the-average-of-each-index-in-a-double-hash-map-and-assign-it -в-ан-выход)? –

+0

Привет, Даниэль. Я думаю, основываясь на его сценарии, наконец, мы должны разделить по карте keySet.size(). – zzyclark

+0

о, моя опечатка. Ты прав. Просто отредактировал ответ – DanielX2010

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