实现我自己的HashSet类...我的add()逻辑似乎有问题

时间:2012-03-24 23:50:57

标签: java algorithm data-structures add hashset

当扫描文件中的单词并使用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;
}

2 个答案:

答案 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;