当扫描文件中的单词并使用API中的内置hashset类时,我的单词计数返回349(这应该是它应该是什么)
使用我自制的hashset类,我得到235 ...所以我的add()方法中的某些东西一定是错的,但是我无法理解它是什么。
感谢您的帮助!
public class HashWordSet implements WordSet {
private int size = 0;
private Node[] buckets = new Node[8];
public Iterator<Word> iterator() {
return new WordIterator();
}
//Add word if not already added
public void add(Word word) {
int key = getBucketNumber(word);
Node node = buckets[key];
while (node != null) {
if (node.value.equals(word))
return;
else
node = node.next;
}
node = new Node(word);
buckets[key] = node;
size++;
if (size == buckets.length) rehash();
}
private int getBucketNumber(Word word) {
int hc = word.hashCode();
if (hc < 0) hc = -hc;
return hc % buckets.length;
}
答案 0 :(得分:2)
您似乎覆盖 nodes[key]
使用新单词[only] 而不是将新节点附加到列表中,因此您丢失了所有旧数据已经存在于此节点中。
如果在调用add()
之前没有元素,它应该可以正常工作,但是如果有 - 你会丢失一些数据。
node = new Node(word);
buckets[key] = node;
如果没有Node
的实际实施,很难100%确定。
答案 1 :(得分:1)
node = new Node(word);
buckets[key] = node;
如果存储桶中已有任何节点,您只需将它们扔掉。尝试类似:
node = new Node(word);
node.next = buckets[key];
buckets[key] = node;