2012-03-24 14 views
2

beim Scannen einer Datei nach Wörtern und die integrierte hashset-Klasse aus der API, gibt meine Wortzahl 349 (was es sein soll)Implementieren meiner eigenen HashSet-Klasse ... meine add() - Logik scheint fehlerhaft

Mit meiner selbstgemachten hashset-Klasse bekomme ich 235 ... also etwas in meiner add() - Methode muss falsch sein, aber ich kann nicht verstehen, was es ist.

danke für jede Hilfe!

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; 
} 

Antwort

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

Wenn bereits Knoten im Bucket vorhanden sind, haben Sie sie einfach weggeworfen. Versuchen Sie etwas wie:

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

danke digitaljoel! das war es genau! – Wangagat

+0

sicher Ding. Es war eine schöne Ablenkung :) – digitaljoel

2

Es scheint, wie Sienodes[key] mit dem neuen Wort außer Kraft setzen [nur] statt ein neuer Knoten in die Liste angehängt, so dass Sie alle alten Daten verlieren, die bereits in diesem Knoten war.

Es sollte gut funktionieren, wenn dort keine Elemente sind, bevor add() aufgerufen wurde, aber wenn es - Sie werden einige Daten verlieren.

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

Obwohl es schwierig ist, ohne die tatsächliche Umsetzung von Node etwa zu 100% sicher zu sein.

Verwandte Themen