我尝试使用字符串的哈希码和数组的模数长度来获得哈希表的存储位置的索引。下面是我认为我搞砸了的地方:
数组声明和构造函数:
private Bucket[] list;
public Hash() {
list = new Bucket[8];
}
以及实际的代码:
//if such a key exists already, you should replace its value
public void insert(String key, Textbook value) {
rehash();
if(list[key.hashCode()%list.length].insert(key, value)) size++;
}
//checks if the key exists
public boolean contains(String key) {
return (list[key.hashCode()%list.length] != null) ? list[key.hashCode()%list.length].contains(key) : false;
}
public void remove(String key) {
if(list[key.hashCode()%list.length].remove(key)) size --;
}
insert和remove返回null指针,contains方法返回false。
我做错了什么。谢谢。
发布于 2012-05-06 21:23:20
list = new Bucket[8];
不分配任何Bucket
对象,它只分配一个充满null
值的数组。
因此,list[key.hashCode()%list.length] == null
(解释了为什么contains()
返回null
,list[key.hashCode()%list.length].remove(...)
或list[key.hashCode()%list.length].insert(...)
导致您尝试访问null
,这反过来会导致NPE)。
您还必须迭代数组,并使用Bucket
的构造函数或某些工厂方法初始化每个具有非空值的元素。
https://stackoverflow.com/questions/10474401
复制相似问题