Simple table de hachage de la mise en œuvre à l'aide d'un tableau en Java?
Je vais avoir un problème avec la mise en œuvre d'un système très simple table de hachage à l'aide d'un tableau. Le problème est que le premier Article dans le HashTable
est toujours AVAILABLE
. Peut-être que vous les gars peuvent voir ce qui ne va pas. C'est le HashTable
classe:
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;
}
}
Pour plus de clarté, c'est le Item
classe:
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;
}
}
Pour donner un exemple:
HashTable ht = new HashTable(10);
ht.put("1", "a");
La sortie de toString() après la mise doit être:
"<HashTable[<Item(1,a)>]>"
mais j'obtiens:
"<HashTable[<Item(Available,null)>]>"
mise à jour: je devrais probablement mentionner que l'Élément suivant est mis correctement et celle d'après qui n'est pas nouveau.
OriginalL'auteur Loolooii | 2012-03-31
Vous devez vous connecter pour publier un commentaire.
Je pense que le problème est dans votre
toString
méthode. Vous boucle pour les 0 - taille lorsque la taille = 1 donc, une fois de sorte que vous puissiez imprimer uniquement la première valeur dans votre table de hachage problème, c'est la première valeur de votre table de hachage n'est pas une valeur réelle, c'est une DISPOSITION que vous avez à faire quelque chose comme ceciEDIT: Désolé j'ai oublié de déplacer l'index.
la boucle de la
toString
méthode? Chaque fois que vous disposez d'une cellule qui n'est pasAVAILABLE
i
est incrémenté de sorte qu'il devrait s'arrêter quandi=size
. Donc, sisize
est réglé correctement (il semble) et il y a un élément dans le tableau qui n'est pas égal àAVAILABLE
elle doit s'arrêter.Oui la boucle de la méthode toString. Je sais, elle doit s'arrêter, mais de toute façon il n'en a pas?!
Et la boucle en mettre() ne s'arrête pas lorsque je change &&||.
avez-vous essayé de déboguer? Ce qui se passe?
OriginalL'auteur twain249
Essayez ceci pour toString() si toujours intéressé à la solution, je l'ai exécuté et sa fine:
OriginalL'auteur varshnes