Java链式哈希表程序报错:ChainHash类构造方法、add方法未定义
问题根本原因
你出现的两处报错全部是ChainHash类的代码结构错误导致:
- 成员定义位置错误:
ChainHash类的哈希表属性(size、table数组)、构造方法、add/remove/search/dump等业务方法全部错误写在了内部Node类中,外层ChainHash类本身是空实现,自然找不到对应的构造方法和成员方法。 - 构造方法写法错误:即便把代码移到外层,你当前写的构造方法加了
void返回值,Java中构造方法不能定义返回值,加了void会被识别为普通成员方法,不会在类实例化时被调用。
修正后的ChainHash类完整代码
package week14; public class ChainHash<K,V> { class Node<K, V> { private K key; private V data; private Node<K, V> next; public Node(K key, V data, Node<K, V> next) { this.key = key; this.data = data; this.next = next; } K getKey() { return key; } V getValue() { return data; } } // 以下属性和方法从Node类移到ChainHash外层类 private int size; private Node<K,V>[] table; // 去掉构造方法的void返回值 public ChainHash(int capacity) { try { table = new Node[capacity]; this.size = capacity; } catch (OutOfMemoryError e) { this.size = 0; } } public int hashValue(Object key) { return key.hashCode() % size; } public V search(K key) { int hash = hashValue(key); Node<K,V> p = table[hash]; while (p != null) { if (p.getKey().equals(key)) return p.getValue(); p = p.next; } return null; } public int add(K key, V data) { int hash = hashValue(key); Node<K,V> p = table[hash]; while (p != null) { if (p.getKey().equals(key)) return 1; p = p.next; } Node<K,V> temp = new Node<K,V>(key, data, table[hash]); table[hash] = temp; return 0; } public void dump() { for (int i=0; i<size; i++) { Node<K,V> p = table[i]; System.out.printf("%02d ", i); while (p != null) { System.out.printf("-> %s (%s) ", p.getKey(), p.getValue()); p = p.next; } System.out.println(); } } public int remove(K key) { int hash = hashValue(key); Node<K,V> p = table[hash]; Node<K,V> pp = null; while (p != null) { if (p.getKey().equals(key)) { if (pp == null) table[hash] = p.next; else pp.next = p.next; return 0; } pp = p; p = p.next; } return 1; } }
修正后两处报错都会消失,可正常运行哈希表的增删查改功能。
内容的提问来源于stack exchange,提问作者RainyDay
相关产品推荐
相关产品推荐

