java - 实现自己的哈希集

标签 java hash hashset

我正在研究java中的哈希集,为此我正在编写创建自己的哈希集,每次达到阈值时其大小都会加倍。这里我将阈值保持为原始大小的0.75。但是我的代码陷入了无限循环。我尝试调试它,但无法找到我的错误...

这是代码

package drafta;

import java.util.Iterator;
import java.util.NoSuchElementException;


public class HashSet
{
private Node[] buckets;
private int currentSize;
private int current;

public HashSet(int bucketsLength)
{
 buckets=new Node[bucketsLength];
 currentSize=0;
}

 public boolean contains(Object x)
{
return false;
  // don't implement for the draft
}


 public boolean add(Object x)
 {
  int key=gethashcode(x);
  Node node = buckets[key];
  while(node!=null){
      if(node.data.equals(x)){
          return false;
      }

  }

  if(buckets[current]==null){
  node = new Node(x);
  current=key;
  buckets[key]=node;
  currentSize++;
  }else{
      node = new Node(x);
      node.next=buckets[current];
      current=key;
      buckets[key]=node;
      currentSize++;
  }
  System.out.println("add successful "+ x);
  System.out.println(" size "+currentSize+" rehash "+buckets.length*0.75);

  if(currentSize>(buckets.length*0.75)){
     rehash();
  }
  return true;
 }

private void rehash() {
   Node temp=buckets[current];
   Object s[]=new Object[buckets.length];
   buckets=new Node[2*buckets.length];
currentSize=0;
int i=0;
while(temp!=null){
    s[i]=temp.data;
    temp=temp.next;
    i++;
}
while(i>0){

    add(s[--i]);

}
}


public boolean remove(Object x)
{
return false;
  // don't implement for draft
}

public int gethashcode(Object x){
   int hc = x.hashCode();
   if(hc<0)
       hc=-hc;
   return (hc%buckets.length);
  } 

public Iterator<Object> iterator()
{
   Iterator <Object> i=new HashSetIterator();
return i;
//
 }

 public int size()
 {
return currentSize;
  //
 }

 private void resize(int newLength)
 {
    }

  public int getlength()
 {
return buckets.length;
  //
  }


 class Node
{

    public Object data;
    public Node next;
    public Node(Object x) {
        data=x;
    }
    public String toString(){
        return data.toString();
    }
}

  class HashSetIterator implements Iterator<Object>
 {
  private int bucket=0;
  private Node currentnode;

   public HashSetIterator()
   {
    currentnode=buckets[current];
  }

  public boolean hasNext()
  {
    if(currentnode.next!=null)
        return true;
    else 
        return false;
     //
  }

  public Object next()
  {
    return currentnode.next;
     //
  }

@Override
public void remove() {
    currentnode.next=currentnode.next.next;

}



   }
}

这是我用来测试我的代码的主类

package drafta;

import java.util.Iterator;

public class HashSetTester
{
public static void main(String[] args)
{
  HashSet names = new HashSet(5);

  names.add("Harry");
  names.add("Sue");
  names.add("Nina");

  System.out.println(names.size() + " " + names.getlength());


  names.add("Susannah");
  System.out.println(names.size() + " " + names.getlength());



  System.out.println();
  names.add("Larry");
  names.add("Juliet");
  names.add("Katherine");
  names.add("Romeo");
  names.add("Maria");


  System.out.println(names.size() + " " + names.getlength());

  names.add("Ann");
  names.add("Taylor");
  System.out.println(names.size() + " " + names.getlength());




}
}

有人可以指出我的错误吗..当代码第二次调用 rehash 时,它会进入无限循环..第一次正确执行时...

最佳答案

您不会在 add 方法中更改 while 循环中的任何条件 - 因此它没有理由崩溃。

while(node!=null){
      if(node.data.equals(x)){
          return false;
      }
  }

您将继续循环,直到节点为 null(永远不会被设置)或节点数据等于 x,但数据值也永远不会被设置。

关于java - 实现自己的哈希集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20379676/

相关文章:

java - 如何从一行中单独读取字符串

.net - 为什么HashSet <T>不实现ICollection?

java - set.contains() 和多态性?

c# - 将 C# Activity 附加到一个 Android 应用程序中的 Java Activity

javascript - 如何使 GWT/GXT RichTextEditor 工具提示不可选择?

encryption - 建议用于存储密码的哈希算法是什么?

javascript - 第一次这一行 console.log ("alphabet--->"+ alphabet);正在打印未定义

java - Argon2 Web 应用程序 Java

java - HashSet 值计算错误

Java char 包含值 > 255?