2015-01-23 4 views
0

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

так вот что я сделал:

private LinkedList<Entry<K,V>>[] bucketArray; 

Этот массив будет держать все LinkedList, который будет служить в качестве цепей. Существует также внутренний класс Entry в классе HashTable, каждый из которых содержит ключевой ключ K, а также V-значение.

В застройщик за столом я на самом деле initialze массив:

public HashTable(int capacity, int prime) { 
    this.capacity = capacity; 
    this.prime = prime; 
    bucketArray = (LinkedList<Entry<K, V>>[]) new Object[this.capacity]; 
} 

Так премьер просто Gonne использоваться для расчета сжатого ключа, емкость для размера массива. но поскольку я запускаю этот jvm, вы выбрасываете classcastexception.

Если я изменю новый объект в новый LinkedList [this.capacity], то у меня есть исключение NullPointer в моем методе пут, который выглядит следующим образом:

public void put(K k, V v) { 
    int h = hashValue(k); 
    bucketArray[h].add(new Entry<K, V>(k, v)); 
} 

ради простоты методы всегда возвращает значение хэша 1 .

Как это можно было бы сделать правильно?

+0

Массивы инициализируются нулевыми элементами по умолчанию. Вы должны проверить, содержит ли ваш bucketArray [h] значение null и инициализирует этот элемент новым экземпляром LinkedList. Что-то вроде if (buckerArray [h] == null) {buckerArray [h] = new LinkedList >(); } перед bucketArray [h] .add (new Entry (k, v)) – vbezhenar

ответ

1

Похоже, вы пытаетесь нарисовать Object[] на LinkedList[] - вот почему вы получаете сообщение об ошибке. На самом деле, бросок даже не требуется, если вы создаете правильный тип:

bucketArray = new LinkedList[this.capacity]; 

Ваш NPE другой вопрос - вы выделили bucketArray, но каждый элемент в нем null - вы, вероятно, хотите выполнить нулевую проверку на bucketArray[h] и назначить ее new LinkedList, прежде чем пытаться добавить к ней записи.

+0

Я изменил его так, как вы связали, но затем я получил nullpointerexception в моем методе put, который я добавлю в свой комментарий. Я подозреваю, что это потому, что массив не создается, может быть. – Spartan

+0

Я обновил свой ответ. Если у вас есть другие проблемы, связанные с другими методами, вероятно, лучше будет публиковать новые вопросы, относящиеся к этому, а не постоянно добавлять здесь дополнительные вопросы. – Krease

+0

alleight, спасибо за ответы, я удалил бросок, и теперь он отлично работает, спасибо за помощь снова !! – Spartan

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