重新调整哈希表的大小

时间:2013-12-05 00:18:47

标签: java nullpointerexception resize hashtable

我正试图调整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 Size10
然而;一旦我们增加了尺寸,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

1 个答案:

答案 0 :(得分:1)

如果这是resize()的所有代码,那么您无法将newTable分配给类属性,即旧表。现在你用数据填充它,然后不用它做任何事情,因为它是在resize内定义的,因此在它之外是不可用的。

所以你最终认为你现在有一个更大的桌子,但实际上你还在使用旧桌子; - )