所以我有一个任务涉及创建自己的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.我不能找出原因 - 有人能指出我正确的方向吗?
答案 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
对象可能不一定是同一个对象。