链接列表未正确初始化

时间:2017-12-08 23:18:20

标签: java hashmap

所以我有一个任务涉及创建自己的HashMap实现。我的代码 - 下面的工作原理是首先调用一个设置数组大小的构造函数。然后,它计算要添加到列表中的单词的哈希值。它转到Array中的那个位置并检查那里是否有值。如果没有,则在那里创建一个新节点并添加数据,指针指向null。如果已经存在Cell,则会创建一个新Cell,但指针指向之前存在的Cell,从而创建一个Linked List。

我的计数方法,首先找到所请求单词的哈希值。然后,它搜索该点上的链接列表并返回一个值。

public class WordStoreImp implements WordStore{

public class Node<T>{
   public T data;
   public Node<T> next;
   public Node(){
   }

   public Node(T data, Node<T> next)
   {
      this.data = data;
      this.next = next;
   }
}

static Node[] array;

public WordStoreImp(int n){
    array = new Node[n];
}

public void add(String word){
    int position = hashFunction(word);
    if(position<0){
        position =  position *- 1;
    }
    if(array[position] == null){
        array[position] = new Node(word, null);
    }else{
        Node newHead = new Node(word, array[position]);
        array[position] = newHead;
    }
}



public int count(String word){
        int number = 0;
        int position = hashFunction(word);
        if(position<0){
            position = position *- 1;
        }
        for(; array[position] != null; array[position] = array[position].next){
            if(array[position].data == word){
                number++;
            }
        }
        //System.out.println(number);
        return number;
    }

public int hashFunction(String a){
    int sum = 1;
        for(int i = 0; i<a.length(); i++){
            char b = a.charAt(i);
            int value = (int) b;
            sum *= value;
     }
     sum = sum % array.length;
     if(sum<0){
         sum = sum*-1;
     }
     return sum;
 }

public static void main(String[] args) {
    WordStoreImp a = new WordStoreImp(100);
    a.addthings("abc", 100);
    a.count("abc");
    a.count("abc");
}
}

我的问题是我的计数方法不起作用而我无法弄清楚原因 - 第一次它返回项目存在的次数很好,但它然后起作用 - 并返回0.我不能找出原因 - 有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

当您调用count方法时,您正在更改链接列表的头部。您正在for循环行中执行此操作:

for(; array[position] != null; array[position] = array[position].next){

完成此循环后,您可以通过重复更新array[position]直到它null来有效地将所有链接列表项移出您的广告素材。

相反,使用初始化为array[position]的局部变量,并更新 it 而不是array[position],如下所示:

for(Node<T> curr = array[position]; curr != null; curr = curr.next){
    if(curr.data == word){
        number++;
    }
}

您可能还想考虑使用.equals方法; ==运算符将确定它们是否是同一个对象,并且两个equals对象可能不一定是同一个对象。