Nabend,
ich noch mal
Jetzt habe ich also mein simples Beispiel der HashMap-Nutzung an's Laufen bekommen. Doch diese konnte mit Kollisionen nicht umgehen. Also habe ich begonnen, eine eigene HashMap (AdressenHashMap) zu bauen. Darin sollten später get und put durch komplexere Funktionen ersetzt werden, so dass put bei einer Kollision eben eine verkettete Liste verlängert (noch nicht drin) und get eben die verkettete Liste zurück gibt.
Doch nun stolpere ich schon auf dem Hinweg. Ich bekomme es gar nicht erst hin eine eigene get-Methode zu schreiben. Wenn ich ein eigenes "get" definiere, compiliert zwar alles, aber offenbar entsteht ein rekursiver Aufruf und das Ding bleibt irgendwann mit einem Overflow liegen.
Wenn ich es get2 nenne, funktioniert es. Das ist zwar OK, aber ich würde schon gerne verstehen, was an meinem ersten Ansatz falsch war (im Sourcecode einfach get2 durch get ersetzen). Zumal es bei put problemlos funktioniert.
Hat da jemand eine Idee?
hier das drumherum
Danke schonmal.
ich noch mal
Jetzt habe ich also mein simples Beispiel der HashMap-Nutzung an's Laufen bekommen. Doch diese konnte mit Kollisionen nicht umgehen. Also habe ich begonnen, eine eigene HashMap (AdressenHashMap) zu bauen. Darin sollten später get und put durch komplexere Funktionen ersetzt werden, so dass put bei einer Kollision eben eine verkettete Liste verlängert (noch nicht drin) und get eben die verkettete Liste zurück gibt.
Doch nun stolpere ich schon auf dem Hinweg. Ich bekomme es gar nicht erst hin eine eigene get-Methode zu schreiben. Wenn ich ein eigenes "get" definiere, compiliert zwar alles, aber offenbar entsteht ein rekursiver Aufruf und das Ding bleibt irgendwann mit einem Overflow liegen.
Wenn ich es get2 nenne, funktioniert es. Das ist zwar OK, aber ich würde schon gerne verstehen, was an meinem ersten Ansatz falsch war (im Sourcecode einfach get2 durch get ersetzen). Zumal es bei put problemlos funktioniert.
Hat da jemand eine Idee?
Java:
package hash1;
import java.util.HashMap;
import java.util.Map;
class AdressHashMap extends HashMap<Integer,Adresse>
{
AdressHashMap()
{
super();
}
public Adresse put ( Adresse a)
{
Integer hv;
hv = a.hashCode();
System.out.println("Put: "+hv+"--"+a);
return this.put(hv,a);
}
public Adresse get2 (Integer kv)
{
String text = "fail";
Adresse ad = new Adresse("fail","fail","fail","fail");
ad = this.get(kv);
text = ad.toString();
System.out.println("Get: "+kv+" = "+text);
return ad;
}
}
hier das drumherum
Java:
package hash1;
public class Adresse {
String vorname;
String nachname;
String strasse;
String ort;
Adresse (String vn, String nn, String st, String or)
{
vorname = vn;
nachname = nn;
strasse = st;
ort = or;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Adresse other = (Adresse) obj;
if (nachname == null) {
if (other.nachname != null)
return false;
} else if (!nachname.equals(other.nachname))
return false;
return true;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((nachname == null) ? 0 : nachname.hashCode());
System.out.println("HC für >"+nachname+"< = "+result);
return result;
}
public String toString()
{
return vorname+", "+nachname+"; "+strasse+", "+ort;
}
}
Java:
package hash1;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
public class Example3 {
public static void main(String[] args) {
Adresse a = new Adresse("","","","");
Adresse b = new Adresse("","","","");
Collection<Adresse> adressliste = new LinkedList<Adresse>();
AdressHashMap adlhash = new AdressHashMap();
// Beispieldaten einfüllen
adressliste.add(new Adresse("Alerich","Amann","3","4"));
adressliste.add(new Adresse("Berta","Bfrau","3","4"));
adressliste.add(new Adresse("Charlie","Code","3","4"));
adressliste.add(new Adresse("Dieter","Amann","3","4"));
// Jetzt einfach wieder ausgeben und dabei in einer Hash-Tabelle abspeichern
for ( Iterator<Adresse> i = adressliste.iterator(); i.hasNext(); )
{
a = i.next();
adlhash.put(a);
}
System.out.println("-----------------------");
/* Hash-Map zeigen */
for ( Map.Entry< Integer , Adresse> elem : adlhash.entrySet())
{
a = elem.getValue();
System.out.println(a.nachname+" > "+elem.getKey());
}
// Suche
System.out.println("-----------------------");
Integer hc = 0;
a = new Adresse("","Amann","","");
hc = a.hashCode();
System.out.println("Suche "+hc+" = "+a);
b = adlhash.get2(hc);
System.out.println("Finde "+hc+" = "+b);
}
}
Danke schonmal.