Реализация моего собственного класса HashSet ... моя логика add () кажется неверной - PullRequest
2 голосов
/ 25 марта 2012

при сканировании файла на наличие слов и использовании встроенного класса хэш-набора из API мой счетчик слов возвращает 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 ]

2 голосов
/ 25 марта 2012

Похоже, вы переопределяете nodes[key] новым словом [только] вместо добавления нового узла в список, поэтому вы теряете все старые данные, которые уже были в этот узел.

Он должен работать нормально, если там не было элементов до вызова add(), но если они есть - вы потеряете некоторые данные.

node = new Node(word);
buckets[key] = node;

Хотя трудно быть уверенным на 100% без фактической реализации Node.

1 голос
/ 25 марта 2012
node = new Node(word);
buckets[key] = node;

Если в корзине уже есть какие-либо узлы, вы просто выбросили их. Попробуйте что-то вроде:

node = new Node(word);
node.next = buckets[key];
buckets[key] = node;
...