public class HashTable <K, V> implements Table<K, V>{
PairHolder table[];
int idx;
public HashTable(int size){
table=new PairHolder[size];
}
public void put(K key, V value) {
int hVal = key.hashCode();
int index = hashFunc1(hVal);
int temp = hashFunc2(hVal);
int col = index +=temp;
while(table[index]!=null){
index += temp;
index %=table.length;
}
table[index].value=value;
}
}
public int hashFunc1(int key){
int abs = Math.abs(key%table.length);
return abs;
}
public int hashFunc2(int key){
int abs = Math.abs(5-key%5);
return abs;
}
我正在尝试加倍哈希,我对如何做到这一点很困惑。我认为我走在正确的轨道上,但这是NullPointerException
table[index].value=value;
。
任何帮助都会很棒。
答案 0 :(得分:0)
想想这个剪了一分钟:
while(table[index]!=null){
index += temp;
index %=table.length;
}
table[index].value=value;
无限循环,直到table[index]
为止,然后继续。根据定义,当你到达最后一行时,table[index]
必须为null,并且当你试图取消引用它时,肯定会抛出一个NullPointerException!
也许你想要这样的东西?
while(table[index]!=null){
index += temp;
index %=table.length;
}
table[index] = new PairHolder(key,value);
在完成这项工作后,并不完全清楚你打算如何实施......但它修复了你的空指针:)
如果我“更正”你的代码,你知道为什么另一个帖子中的海报说你实际上并不是双重哈希?
public void put(K key, V value) {
int keyInt = key.hashCode();
int hash1 = hashFunc1(keyInt);
int hash2 = hashFunc2(keyInt);
int index = hash1 % table.lenght;
int temp = hash2;
//etc etc
}
public int hashFunc1(int key){
int abs = Math.abs(key);
return abs;
}
public int hashFunc2(int key){
int abs = Math.abs(5-key%5);
return abs;
}