2012-03-31 10 views
4

Ich habe ein Problem mit der Implementierung einer sehr einfachen HashTable mit einem Array. Das Problem ist, dass das erste Element in den HashTable setzen ist immer AVAILABLE. Vielleicht könnt ihr sehen, was schief läuft. Dies ist die HashTable Klasse:Einfache HashTable-Implementierung mit einem Array in Java?

public class HashTable { 

    private Item[] data; 
    private int capacity; 
    private int size; 
    private static final Item AVAILABLE = new Item("Available", null); 

    public HashTable(int capacity) { 

     this.capacity = capacity; 
     data = new Item[capacity]; 
     for(int i = 0; i < data.length; i++) { 

      data[i] = AVAILABLE; 
     } 
     size = 0; 
    } 

    public int size() { 

     return size; 
    } 

    public int hashThis(String key) { 

     return key.hashCode() % capacity; 
    } 

    public Object get(String key) { 

     int hash = hashThis(key); 

     while(data[hash] != AVAILABLE && data[hash].key() != key) { 

      hash = (hash + 1) % capacity; 
     } 
     return data[hash].element(); 
    } 

    public void put(String key, Object element) { 

     if(key != null) { 
      size++; 
      int hash = hashThis(key); 
      while(data[hash] != AVAILABLE && data[hash].key() != key) { 

       hash = (hash + 1) % capacity; 
      } 

      data[hash] = new Item(key, element); 

     } 

    } 

    public Object remove(String key) { 
     // not important now. 
     throw new UnsupportedOperationException("Can't remove"); 
    } 

    public String toString() { 

     String s = "<HashTable["; 
     for(int i = 0; i < this.size(); i++) { 

      s += data[i].toString(); 
      if(i < this.size() - 1) { 

       s += ","; 
      } 
     } 
     s += "]>"; 
     return s; 
    } 

} 

Für mehr Klarheit, ist dies die Item Klasse:

public class Item { 

    private String key; 
    private Object element; 

    public Item(String key, Object element) { 

     this.setKey(key); 
     this.setElement(element); 
    } 

    public String key() { 
     return key; 
    } 

    public void setKey(String key) { 
     this.key = key; 
    } 

    public Object element() { 
     return element; 
    } 

    public void setElement(Object element) { 
     this.element = element; 
    } 

    public String toString() { 

     String s = "<Item("; 
     s += this.key() + "," + this.element() + ")>"; 
     return s; 
    } 

} 

ein Beispiel zu geben:

HashTable ht = new HashTable(10); 
ht.put("1", "a"); 

Die Ausgabe von toString() nach dem Aufsetzen muss sein:

"<HashTable[<Item(1,a)>]>" 

aber ich bekomme:

"<HashTable[<Item(Available,null)>]>" 

Update: Ich sollte wohl erwähnen, dass der nächste Punkt korrekt gesetzt wird und derjenige danach wieder nicht.

Antwort

2

ich glaube, das Problem in Ihrer toString Methode. Sie Schleife für 0 - Größe, wenn size = 1 so einmal, so dass Sie nur in Ihrem hashtable Problem aus dem ersten Wert drucken ist der erste Wert in der Hash-Tabelle ist nicht ein realer Wert, es ist ein AVAILABLE Sie haben so etwas wie diese

zu tun

EDIT: Leider habe ich vergessen, den Index zu verschieben.

public String toString() { 
    String s = "<HashTable["; 
    int i = 0; 
    int count = 0; 
    while(count < this.size()) { 

     //Skip the AVAILABLE cells 
     if(data[i] == AVAILABLE) { 
      i++; 
      continue; 
     } 

     s += data[i].toString(); 
     if(count < this.size() - 1) { 
      s += ","; 
     } 
     count++; 
    } 
    s += "]>"; 
    return s; 
} 
+0

Die Schleife jetzt hört nie :) – Loolooii

+0

@Loolooii die Schleife im 'toString' Methode? Jedes Mal, wenn Sie eine Zelle haben, die nicht "VERFÜGBAR" ist, wird "i" inkrementiert und sollte aufhören, wenn "i = Größe". Wenn also "size" korrekt eingestellt ist (was es zu sein scheint) und es ein Element im Array gibt, das nicht "AVAILABLE" entspricht, sollte es aufhören. – twain249

+0

Ja, die Schleife in der toString-Methode. Ich weiß, es sollte aufhören, aber irgendwie nicht ?! – Loolooii

1

Versuchen Sie dies für toString(), wenn noch Interesse an der Lösung, lief ich ihm und seinen feinen:

public String toString() 
{ 
    String s = "<HashTable["; 
    for (int i = 0; i < this.capacity; i++) 
    { 
     if (data[i].Element != null) 
     { 
      s += data[i].toString(); 
      if (i < this.size - 1) 
      { 
       s += ","; 
      } 
     } 
    } 
    s += "]>"; 
    return s; 
}