2015-10-20 68 views
1

我想实现散列集,它将存储Word对象,但是当我添加多个单词对象时,它给我总是大小1,我真的不知道这里的问题在哪里是一些部分我的代码:Java HashSet错误的大小

public class HashWordSet implements WordSet{ 

private Node[] buckets = new Node[8]; 
private int size=0; 

private class Node{ 
    Word value; 
    Node next = null; 
    Node prev = null; 

    public Node (Word word){ 
     value = word; 
    } 
} 
private int getBucketNumber(Word word){ 
    int hash = word.hashCode(); 
    if(hash<0){ 
     hash = -hash; 
    } 
    return hash%buckets.length; 
} 
    private void rehash(){ 
     Node[] temp = buckets; 
     buckets = new Node[2*temp.length]; 
     size = 0; 
     for (Node n : temp){ 

       while (n != null){ 
        add(n.value); 
        n = n.next; 
       } 

     } 
    } 
@Override 
public Iterator iterator() { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void add(Word word) { 
    int pos = getBucketNumber(word); 
    Node node = buckets[pos]; 
     while(node != null){ 
      if(node.value.equals(word)) 
       return; 
      else 
       node = node.next; 
     } 
     node = new Node(word); 
     node.next = buckets[pos]; 
     buckets[pos] = node; 
     size++; 
     if(size == buckets.length) 
      rehash(); 

} 

@Override 
public boolean contains(Word word) { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public int size() { 

    return size; 
} 
public String toString() { 
    StringBuffer buf = new StringBuffer(); 
    for (int i=0;i<buckets.length;i++) { 
     Node node = buckets[i]; 
     if (node == null) continue; 
     buf.append("Bucket "+i+":"); 
     while (node != null) { 
      buf.append(" "+node.value); 
      node = node.next; 
     } 
     buf.append("\n"); 
    } 
    return buf.toString(); 
} 

}

回答

3

看起来你在这里有一个逻辑天翻地覆。你永远不会进入你的while循环。我没有足够的代码来确定这是否是唯一的问题,但删除if检查肯定会有所帮助。

if (n == null){ // remove this 
    while (n != null){ 
     add(n.value); 
     n = n.next; 
    } 
} 
+0

我刚更新了帖子,我把全班同学:// – Tano

+0

我假设你有更多的错误?你有什么试图调试这个问题? – jgitter

+0

我开始实施一步一步的方法,我现在没有任何其他错误,因为我只实现了两种方法:/ – Tano

1

rehash()这些线条看起来是错误的:

for (Node n : temp){ 
      if (n == null){ //WRONG?! 
       while (n != null){ 
        add(n.value); 
        n = n.next; 
       } 
      } 
     } 

你只有零点工作...