我正试图调整hash table
的大小;我一直在NullPointerException
。
我知道如果大小大于0.75
,则表大小必须加倍,如果小于0.50
则表大小减半。到目前为止,我有这个..
public boolean add(Object x)
{
int h = x.hashCode();
if (h < 0) { h = -h; }
h = h % buckets.length;
Node current = buckets[h];
while (current != null)
{
if (current.data.equals(x)) { return false; }
// Already in the set
current = current.next;
}
Node newNode = new Node();
newNode.data = x;
newNode.next = buckets[h];
buckets[h] = newNode;
currentSize++;
double factor1 = currentSize * load1; //load1 = 0.75
double factor2 = currentSize * load2; //load2 = 0.50
if (currentSize > factor1) { resize(buckets.length*2); }
if (currentSize < factor2) { resize(buckets.length/2); }
return true;
}
实施例。 Size = 3. Max Size = 5
如果我们采用Max Size
并乘以0.75
,我们会得到3.75
。
这是一个因素,如果我们通过它Max Size
必须double
因此,如果我们在element
中添加额外table
,则尺寸为4
且> 3.75
,因此新Max Size
为10
。
然而;一旦我们增加了尺寸,hashcode
会因添加新的element
而发生变化,因此我们会调用resize(int newSize)
private void resize(int newLength)
{
//
HashSet newTable = new HashSet(newLength);
for (int i = 0; i < buckets.length; i++) {
newTable.add(buckets[i]);
}
}
如果buckets[i]
混淆了任何人,那么这是我的构造函数。
public HashSet(int bucketsLength)
{
buckets = new Node[bucketsLength];
currentSize = 0;
}
我认为逻辑是正确的,除非我的resize
方法没有检索elements
。
答案 0 :(得分:1)
如果这是resize()
的所有代码,那么您无法将newTable
分配给类属性,即旧表。现在你用数据填充它,然后不用它做任何事情,因为它是在resize
内定义的,因此在它之外是不可用的。
所以你最终认为你现在有一个更大的桌子,但实际上你还在使用旧桌子; - )