ich habe eine Hash klasse, die eine Methode hat die folgendes Tun soll :
Findet die Referenz zu dem Entry mit key oder gibt null zurueck.
Aber ich bin glaub ich in einer Endlosschleife gefangen und weiß nicht mehr weiter : D
hier die Methode :
// TODO den richtigen Suchalgorithmus (direkte Verkettung) einsetzen.
/*if (key == null) {
throw new NullPointerException();
}
int h = (key.hashCode() & 0x7FFFFFFF) & data.length;
while (data[h] != null && !key.equals(data[h].key))
{
h = (h+1) % data.length;
}
return data[h] == null ? null : data[h];
*/
if(key == null)
throw new NullPointerException();
int h = hash(key);
while(data[h] != null && !(key.equals(data[h].key)))
h = (h + 1) % data.length;
return data[h];
}```
und hier nocheinmal zum besseren verständnis die Klasse :
```package util;
import util.Hashing.Entry;
/**
* Die Klasse implementiert ein Verzeichnis, in dem nach
* unter einem Schluessel gespeicherten Daten gesucht werden
* kann.
* <p>
* Als Implementierungsmethode wird die Kollisionsbehandlung der
* direkten Verkettung verwendet.
*/
public class Hashing<K,V> implements IMap<K,V> {
/**
* Anzahl der gespeicherten Key-Value-Paare.
*/
private int size = 0;
/**
* Feld mit den Daten.
*/
@SuppressWarnings("unchecked")
private Entry<K,V>[] data = new Entry[100];
@Override
public int size() {
return size;
}
@Override
public V put(K key, V value) {
Entry<K,V> p = referenceOf(key);
if (p == null) {
int index = hash(key);
data[index] = new Entry<K,V>(key, value, data[index]);
size++;
return null;
}
return p.setValue(value);
}
@Override
public V get(K key) {
Entry<K,V> p = referenceOf(key);
return p == null ? null : p.value;
}
@Override
public boolean containsKey(K key) {
// TODO den richtigen Algorithmus einsetzen.
return referenceOf(key) != null;
}
/**
* Findet die Referenz zu dem Entry mit key oder gibt null zurueck.
* @param key Suchschluessel
* @return null oder Referenz auf gefundenen Entry.
*/
private Entry<K,V> referenceOf(K key) {
// TODO den richtigen Suchalgorithmus (direkte Verkettung) einsetzen.
/*if (key == null) {
throw new NullPointerException();
}
int h = (key.hashCode() & 0x7FFFFFFF) & data.length;
while (data[h] != null && !key.equals(data[h].key))
{
h = (h+1) % data.length;
}
return data[h] == null ? null : data[h];
*/
if(key == null)
throw new NullPointerException();
int h = hash(key);
while(data[h] != null && !(key.equals(data[h].key)))
h = (h + 1) % data.length;
return data[h];
}
private int hash(Object key) {
return key == null ? 0 : (key.hashCode() & 0x7fffffff) % data.length;
}
private static boolean safeEquals(Object a, Object b) {
return a == null ? a == b : a.equals(b);
}
/**
* Klasse fuer die einzelnen Eintraege.
*/
static class Entry<K,V> {
private final K key;
private V value;
private Entry<K,V> link;
/**
* Konstruktor.
*
* @param key Schluesselbegriff.
* @param value eigentlicher Inhalt.
*/
Entry(K key, V value, Entry<K,V> link) {
this.key = key;
this.value = value;
this.link = link;
}
/**
* Veraendert den Inhalt des Eintrags und gibt den ueberschriebenen
* Inhalt zurueck.
*
* @param value neuer Inhalt.
* @return vorhergehender Inhalt.
*/
V setValue(V value) {
V oldValue = this.value;
this.value = value;
return oldValue;
}
@Override
public String toString() {
return key + ":" + value;
}
}
}```
hoffe jemand weiß rat
Der Witz an einer solchen HashMap ist ja, dass der Zugriff in O(1) erfolgt. Du brauchst gar keine Schleife. Berechne den Hashwert des angeforderten Keys, schaue in einem Array nach ob es da einen Eintrag gibt. Wenn ja gibst du den zurück, wenn nicht dann gibst du null zurück.
Jetzt Blick ich garnicht mehr durch ^^ überall wo ich geguckt habe benutzt jeder so eine While Schleife wie ich sie am anfang hatte…
sogar mit ähnlichen Argumenten. Aber irgendwie Funktioniert es nicht -.- Ich glaub der Hashwert stimmt ja aber wie ich weiter machen soll hab ich keine Ahnung : (
Ja genau so soll es sein. nur lese ich überall was anderes : ( Aber überall wird eine While Schleife benutzt deshalb weiß ich nicht ganz wie ich es ohne Schleife schreiben soll -.-
if (key == null) {throw new NullPointerException();} // kann man machen
int h = (key.hashCode() & 0x7FFFFFFF) & data.length; // gut, genauso wird h berechnet
if (null==data[h]) return null; // wenn nix da, nix zurück
if(key.equals(data[h].key)) return data[h]; // treffer
return null;
Problem ist nur das ich immer noch eine Fehlermeldung bekomme: Collisionhandling NullPointerException -.-
Die Sache ist die das ein JUnit Test nebenbei läuft der so Aussieht:
for (int i = 0; i < RANDOM_TESTS; i++)
objTable.put(String.valueOf(i), Double.valueOf(i));
for (int i = 0; i < 1000; i++)
assertEquals(i, objTable.get(String.valueOf(i)).intValue());
}
der meckert bei assertEquals(i,obj…
Aber danke für deine Mühe… Aber keine Ahnung warum der so Reagiert.
Heißt das das der nur eine Null bekommt und deshalb aussteigt?