Присвоение переменных и циклы - PullRequest
1 голос
/ 07 июня 2010

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

tempElement = new hashElement(someInt);

    while(in.hasNext() == true)
    {
        int firstVal = in.nextInt();
        if (firstVal == -911)
        {
            break;
        }
        tempElement.setKeyValue(firstVal, 0);
        for(int i = 1; i<numKeyValues;i++)
        {
            tempElement.setKeyValue(in.nextInt(), i);
        }

        elementArray[placeValue] = tempElement;
        placeValue++;

    }   // close while loop

} // close method

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

Проблема, как я позже определил, заключалась в том, что, поскольку я не создал переменную tempElement в цикле, а также потому, что значения не присваивались elementArray[] до окончания цикла - каждый членбыло определено скорее как "tempElement" - когда цикл завершился, каждый слот в массиве был заполнен последним значением, которое принял tempElement.

Я смог исправить эту ошибку, переместив объявление tempElement в пределахпока цикл.Мой вопрос к вам, Stackoverflow, заключается в том, существует ли другой (читай: лучше) способ избежать этой ошибки, сохраняя объявление переменной tempElement вне цикла while.

Ответы [ 3 ]

2 голосов
/ 07 июня 2010

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

hashElement tempElement;
while (/*...*/) {
    tempElement = new hashElement();
    //...

Это, конечно, не "лучше".В общем, ваши переменные должны быть как можно более узкими.

1 голос
/ 07 июня 2010

Речь идет не об объявлении переменной, а об объектах, которые вы создаете. Массивы в java содержат только ссылки на объекты, поэтому, если вы действительно хотите иметь отдельные объекты в массиве, вам нужно создать их с new где-нибудь в цикле.

tempElement = new WhateverClass();
0 голосов
/ 07 июня 2010
Element tempElement;

while(condition){
    tempElement = new HashElement();

    //do more stuff

    elementArray[index] = tempElement;
}
...