2014-04-24 4 views
0

Я пытаюсь сделать метод, который автоматически создает новый hashTable с 1,25 больше емкости, но у меня ошибка переполнения. Код:Rehashing method throws NullPointerException

public void reHash(){ 

    Config.MAX_ESTACIONS = (int) (Config.MAX_ESTACIONS * 1.25); 
    Vector<EstacioHash>[] newHashTable = new Vector[Config.MAX_ESTACIONS]; 

    EstacioHash nouElement = new EstacioHash(); 

    for (int i=0; i<hashTable.length;i++){ 
     for (int k=0; k<hashTable[i].size();k++){ 

      nouElement.key = hashTable[i].get(k).key; 
      nouElement.value = hashTable[i].get(k).value; 

      int position = hashFunction(nouElement.key); 
      newHashTable[position].add(nouElement); <---- OverFlow here 
     } 
    } 

    hashTable = newHashTable; 

} 

Почему у меня есть overFlow? Программы работают корректно без функции rehash. Хэш-функция:

public int hashFunction (Object clau){ 

    String clauMinuscules = ((String) clau).toLowerCase(); 

    char[] key = clauMinuscules.toCharArray(); 
    int result=0; 

    for (int i=0;i<key.length;i++){ 
     result = (result + key[i]^i)%Config.MAX_ESTACIONS; 
    } 

    return result; 
} 

ответ

1

Я не думаю, что у вас есть переполнение, но больше NullPointerException.

Значение по умолчанию для Object: null. При создании новой таблицы у вас есть массив, полный значений null.

Перед попыткой получить Vector вам необходимо инициализировать каждую запись newHashTable и добавить что-то в нее.

Vector<EstacioHash>[] newHashTable = new Vector[Config.MAX_ESTACIONS]; 
for (int i=0; i<newHashTable.length;i++){ 
    newHashTable[i] = new Vector<EstacioHash>(); 
} 
+0

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

+0

@ user2911701 Вы говорите, что все элементы добавляются к одному и тому же вектору? Возможно, ваш хешфункция работает не так, как ожидалось. Также обратите внимание, что вы всегда добавляете одну и ту же ссылку в свою таблицу. Вы должны поместить 'EstacioHash nouElement = new EstacioHash();' внутри вложенного цикла. –

+0

Спасибо, все проблемы решены. – user2911701

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