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.
Die Schleife jetzt hört nie :) – Loolooii
@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
Ja, die Schleife in der toString-Methode. Ich weiß, es sollte aufhören, aber irgendwie nicht ?! – Loolooii