哈希表重新哈希条件不评估Java
我正在设计一个具有线性探测冲突分辨率的哈希表。我设计了一个容量,它定义了桶的数量和负载系数。当哈希表中的元素数超过容量和负载因子的乘积时,应重新设置数组的哈希值。出于某种原因,我的代码中甚至没有调用该方法。以下是我的主要方法:哈希表重新哈希条件不评估Java,java,Java,我正在设计一个具有线性探测冲突分辨率的哈希表。我设计了一个容量,它定义了桶的数量和负载系数。当哈希表中的元素数超过容量和负载因子的乘积时,应重新设置数组的哈希值。出于某种原因,我的代码中甚至没有调用该方法。以下是我的主要方法: public class MyJHUHashMap<K extends Comparable<? super K>, V> implements JHUHashMap<K, V>{ private int cap; p
public class MyJHUHashMap<K extends Comparable<? super K>, V> implements JHUHashMap<K, V>{
private int cap;
private int numElements;
private double loadFactor;
private Node<K,V>[] hashtable;
public static void main(String[] args) {
MyJHUHashMap<Integer, Integer> m = new MyJHUHashMap<>();
m.put(1, 1);
m.put(2, 2);
m.put(3, 3);
m.put(4, 4);
m.put(5, 5);
m.put(6, 6);
m.put(7, 7);
System.out.println(m.cap);
System.out.println(m.size());
for(int i=0; i<m.hashtable.length; i++) {
if(m.hashtable[i] != null)
System.out.println(m.hashtable[i].key);
}
}
这是我的代码:
private final class Node<K extends Comparable<? super K>, V> {
public K key;
public V val;
public Node() {
this.key = null;
this.val = null;
}
public Node(K theKey, V theValue) {
this.key = theKey;
this.val = theValue;
}
}
public MyJHUHashMap() {
this.cap = 11;
this.numElements = 0;
this.loadFactor = 0.5;
this.hashtable = new Node[cap];
}
public MyJHUHashMap(int pInitCap, double pLoadFactor) {
if(pInitCap > 0 && pLoadFactor > 0) {
this.cap = pInitCap;
this.loadFactor = pLoadFactor;
} else {
throw new IllegalArgumentException();
}
this.numElements = 0;
this.hashtable = new Node[cap];
}
@Override
public V put(K key, V value) {
if(containsKey(key)) {
int foundindex = find(key);
V prevObject = this.hashtable[foundindex].val;
//hashtable[foundindex] = new Node(key, value);
this.hashtable[foundindex].val = value;
return prevObject;
}
int index = key.hashCode() % cap;
if(this.hashtable[index] == null) {
this.hashtable[index] = new Node<K,V>(key, value);
this.numElements++;
return null;
}
boolean found = false;
//index += 1;
while(found) {
index += 1;
if(hashtable[index] == null) {
hashtable[index] = new Node<K,V>(key, value);
this.numElements++;
found = true;
//return null;
}
//index += 1;
}
if(this.numElements > this.cap * this.loadFactor) {
System.out.println("Rehashing...");
rehashAndResize();
}
return null;
}
public void rehashAndResize() {
//Node<K,V>[] temp = new Node[this.hashtable.length*2];
//Node<K,V>[] temp = new Node[this.hashtable.length*2];
System.out.println("Calling rehash method");
MyJHUHashMap<K,V> temp = new MyJHUHashMap<K, V>(this.hashtable.length * 2, this.loadFactor);
for(int i=0; i<this.hashtable.length; i++) {
temp.put(this.hashtable[i].key, this.hashtable[i].val);
}
this.hashtable = temp.hashtable;
}
没有打印Rehashing和调用rehash方法,因此没有调用该方法,我不明白为什么。我输入了7个元素,当我询问哈希表元素的数量时,它正确地输出了7个元素,那么为什么不计算条件呢
编辑:好的,在仔细检查之后,我发现再灰化方法从未实现,因为该方法返回得很早。谢谢你的帮助 在程序运行期间,this.numElements>this.cap*this.loadFactor是否为真?这是调用方法的唯一方式…我添加了7个元素,它知道有7个元素,7>11*0.5,所以应该是真的,你确定吗?同样,如果不调用方法,则该表达式的计算结果必须为false。所发生的情况是,每当插入新值时,该方法都会返回,并且没有冲突,因此从未到达重新灰化方法。谢谢你的帮助!