Datentypen Probleme mit eigenem Get() bei eigener HashMap

btl1000

Mitglied
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?

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.
 
2

2000

Gast
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.

Wo ist das Problem, einfach als values der HashMap List zu verwenden? Als key kann dann das in die jeweilige Liste einzufügende Element gewählt werden. So ist es praktisch, einen Wrapper zu schreiben, der die put implementiert.
 

r.w.

Bekanntes Mitglied
Hallo btl1000,

ein Blick auf die gleichnamigen Funktionen der Klasse HashMap zeigt, das Deine put-Methode andere Parameter
als die der Basisklasse erwartet. Daher wird in Zeile 18 die Methode put der Basisklasse HashMap aufgerufen.
Deine get-Methode überschreibt aber wegen passender Parameterliste die get-Methode von HashMap.
Daher wird in Zeile 26 die Methode get in AddressHashMap aufgerufen und somit die Rekursion "erzeugt".

Ich hoffe, dass gibt Dir Klarheit. (Ich werde später nochmal lesen was ich um diese Zeit zusammengeschrieben hab. ;-) )

VG ROlf
 

Andi_CH

Top Contributor
Wer ausdrücklich this.get() hinschreibt will ja nichts anderes als seinen eigene get Funktion aufrufen...

super.get wäre die bessere Variante. Dann kannst du deine eigene auch wieder get nennen.
 

btl1000

Mitglied
Wo ist das Problem, einfach als values der HashMap List zu verwenden? Als key kann dann das in die jeweilige Liste einzufügende Element gewählt werden. So ist es praktisch, einen Wrapper zu schreiben, der die put implementiert.

Genau so hatte ich es ja vor. Bloß ich muss dazu ja vermutlich get/put eben an die Liste anpassen. Und bei den Vorbereitungen dazu bin ich schon hängengeblieben.

Gibt's das irgendwo schon halbfertig?

Aber mit den aktuellen Hinweisen bin ich dann schon mal ein Stück weiter. Danke an alle.
 

Dit_

Bekanntes Mitglied
Jetzt habe ich also mein simples Beispiel der HashMap-Nutzung an's Laufen bekommen. Doch diese konnte mit Kollisionen nicht umgehen.

Weil du die Methoden
Code:
hashCode()
und
Code:
equals(..)
nicht richtig implementierst. :oops:
Wenn du Eclipse hast, lass die beiden Methoden generieren und schau ob du dann immer noch Kollisionen hast.
 

fastjack

Top Contributor
@Dit die sind mit Absicht so, um Kollisionen zu erzeugen.

Ich würde eine eigene Klasse schreiben:

Java:
class HashMapWithBuckets<K, V> implements Map<K, V> {
    Map<K, List<V>> model = new HashMap<K, List<V>>; // List<V> ist dein Bucket, oder eine Buckets/Bag irgendwas-Klasse nehmen

    // alles was Du überschreiben willst, überschreiben, den Rest geeignet weiterleiten
    @Override
    public void put(K key, V value) {
        List<V> list = this.model.get(key);
        if (list == null) {
            list = new ArrayList<V>();
            this.model.put(key, list);
        }
        list.add(value);
    }

    public void put(V value) {
        this.put(t.hashCode(), value);
    }

    @Override
    public V get(K key) {
        List<V> list = this.model.get(key);
        if (list == null || list.size())  {
            return null;
        }
        return list.get(0); // ist nicht gut alle Elemente zurückzugeben, du mußt dir hier was geeignetes überlegen, oder halte den ersten zurückgeben
    }

}

so ähnlich halt
Von außen sieht das ganze jetzt aus schonmal aus wie eine Map.

Ein kleiner Tip noch: In die Buckets kommen Elemente mit gleichem Hashcode, das bedeutet aber nicht, das sie auch equals sind! Deine Equals-Methode muß richtig funktionieren (über alle relevanten Attribute eben). Der Hash-Code Kontrakt sagt nur, das zwei Objekte, die equals sind, den gleichen Hashcode haen sollen und der Hashcode bei mehrmaligem Aufrufen den gleichen Wert liefern soll. Wie vorhin gesagt, können zwei ungleiche Objekte den selben Hashcode haben.

edit: Dein Beispiel schildert den schlimmsten Fall, nämlich das viele Elemente denselben Hashcode haben, und die Elemente in den Buckets dann alle denselben Hashcode haben.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Array mit eigenem Datentyp probleme beim übergeben Java Basics - Anfänger-Themen 6
J Probleme mit eigenem JPanel (IDE Eclipse) Java Basics - Anfänger-Themen 4
C Probleme mit eigenem CellRenderer Java Basics - Anfänger-Themen 2
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
P Probleme mit NetBeans: Wie lässt sich jar. Datei an einem MacBook öffnen Java Basics - Anfänger-Themen 21
I Projekte in IDE untereinander sharen / Probleme beim Build Java Basics - Anfänger-Themen 8
MiMa Probleme mit Datentyp long ?? Java Basics - Anfänger-Themen 2
T Probleme beim Import eines Git-Repos Java Basics - Anfänger-Themen 2
Jxhnny.lpz TicTacToe Spiel vs Computer. (Probleme) Java Basics - Anfänger-Themen 7
B Quiz mit RMI Probleme mit RMI start Java Basics - Anfänger-Themen 4
httprt Probleme bei dem erstellen von leveln in meinem Spiel Java Basics - Anfänger-Themen 2
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
V Probleme Guessing Game Java Basics - Anfänger-Themen 8
hebein PDF Ausdruck auf Drucker - Probleme mit Format Java Basics - Anfänger-Themen 17
R JMenu/JMenuItem Probleme Java Basics - Anfänger-Themen 2
B Static vs non static und Probleme daraus Java Basics - Anfänger-Themen 13
J Probleme mit dem Debugger Java Basics - Anfänger-Themen 4
I Probleme mit OutputStream - Datei lässt sich nicht öffnen Java Basics - Anfänger-Themen 4
J Probleme mit Kompilierung Java Basics - Anfänger-Themen 11
B Probleme mit Zugriff auf Dateisystem Windows 10 ( jFileChooser) Java Basics - Anfänger-Themen 17
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
C Probleme mit paintComponent Java Basics - Anfänger-Themen 13
P Probleme mit JUnit-Tests, es kommt was anderes raus als bei manuellen Tests Java Basics - Anfänger-Themen 5
E JavaFX Editor Probleme mit der Zwischenablage Java Basics - Anfänger-Themen 12
C Probleme mit dem Erstellen und Importieren von Packages Java Basics - Anfänger-Themen 6
3 OOP erste Versuche, OOP zu verstehen. Probleme mit gettern und settern Java Basics - Anfänger-Themen 4
R Erste Schritte Probleme bei 2D Spielfeld, mit einzufügender "Person" Java Basics - Anfänger-Themen 5
P Probleme bei der Installation von JavaFX Java Basics - Anfänger-Themen 3
S Mehrere Probleme im Code Java Basics - Anfänger-Themen 7
D Probleme mit JFrame und der Größe Java Basics - Anfänger-Themen 8
Dimax String Probleme Java Basics - Anfänger-Themen 12
N Probleme beim printen von Arrays durch for Schleife Java Basics - Anfänger-Themen 3
Splayfer Java Array Probleme Java Basics - Anfänger-Themen 3
J Probleme bei IllegalArgumentException "werfen". Java Basics - Anfänger-Themen 1
K Probleme bei der Ausgabe - komme nicht weiter :/ Java Basics - Anfänger-Themen 15
X Probleme im Umgang mit PriorityQueue Java Basics - Anfänger-Themen 75
D Probleme mit dem Windowbuilder und JComboBox Java Basics - Anfänger-Themen 2
M Regex Probleme (mal wieder) Java Basics - Anfänger-Themen 3
tom.j85 TicTacToe - probleme beim Casten Java Basics - Anfänger-Themen 6
J Probleme mit Vererbung Java Basics - Anfänger-Themen 4
X Probleme mit Übungsaufgaben zu Zahlentypen Java Basics - Anfänger-Themen 4
G Probleme bei Aufgabe Java Basics - Anfänger-Themen 12
P Erste Schritte Probleme mit dem Programmieren Java Basics - Anfänger-Themen 12
B Probleme bei einer Aufgabe Java Basics - Anfänger-Themen 19
Franzi1001 Probleme mit Eclipse Java Basics - Anfänger-Themen 7
T Probleme bei Installation von JDK Java Basics - Anfänger-Themen 2
C Probleme mit String-Vergleich Java Basics - Anfänger-Themen 4
C Probleme bei Regex Java Basics - Anfänger-Themen 9
V Probleme mit Arrays Java Basics - Anfänger-Themen 8
D Kleine Probleme mit Split-Befehlen Java Basics - Anfänger-Themen 5
T Probleme mit Strings Java Basics - Anfänger-Themen 6
G Probleme bei Frame aufgaben Java Basics - Anfänger-Themen 6
N Probleme mit dem ActionListener Java Basics - Anfänger-Themen 4
D Probleme beim Kompelieren mache ich etwas falsch ? Java Basics - Anfänger-Themen 3
L Probleme mit Java Java Basics - Anfänger-Themen 3
S Probleme mit abspielen einer .wav Datei Java Basics - Anfänger-Themen 2
J Probleme bei der Umwandlung einer Farbe von Hex zu RGB Java Basics - Anfänger-Themen 8
K Probleme beim Programm schreiben - Lesen von Dateiinhalten -zaehlen von Wörtern/ Buchstaben Java Basics - Anfänger-Themen 4
M Probleme beim aktualisieren eines JPanels Java Basics - Anfänger-Themen 7
J Probleme beim Array ausgeben Java Basics - Anfänger-Themen 4
M Probleme bei rekursiver Zuordnung Java Basics - Anfänger-Themen 1
I Probleme mit 2 dimensionale Arrays Java Basics - Anfänger-Themen 3
H Best Practice View probleme Java Basics - Anfänger-Themen 2
B Probleme mit Kreisberechnung Java Basics - Anfänger-Themen 15
E Probleme mit Scanner Java Basics - Anfänger-Themen 4
J Eclipse Export Probleme Java Basics - Anfänger-Themen 25
M Probleme beim verwenden von Packages Java Basics - Anfänger-Themen 6
D Probleme mit der Übergabe einer BorderPane Java Basics - Anfänger-Themen 2
J Interface Probleme bei der Implementierung Java Basics - Anfänger-Themen 1
BlueFox Tabelle in der Konsole ausgeben - Probleme Java Basics - Anfänger-Themen 1
G Methoden Probleme beim Methodenaufruf Java Basics - Anfänger-Themen 2
V Klassen ObjectInputStream ->ReadObject Probleme Java Basics - Anfänger-Themen 5
P Probleme mit der Do-Schleife Java Basics - Anfänger-Themen 2
F Erste Schritte Compiling Probleme Java Basics - Anfänger-Themen 13
S Neuling und Probleme bei Schulaufgabe Java Basics - Anfänger-Themen 5
J Anfänger: ActionListener und ProcessBuilder machen Probleme Java Basics - Anfänger-Themen 6
S Erste Schritte 2D Grafik Probleme mit KeyListener. Java Basics - Anfänger-Themen 18
M Probleme mit Eclipse Java Basics - Anfänger-Themen 20
G Probleme beim casten von double zu int Java Basics - Anfänger-Themen 3
E 2 Probleme - Datum & private finale Variablen Java Basics - Anfänger-Themen 5
S Compiler-Fehler javac hat Probleme mit Paketen unter OSX Java Basics - Anfänger-Themen 2
J Probleme beim schreiben von Dateien Java Basics - Anfänger-Themen 5
B Variablen Probleme mit Eclipse Java Basics - Anfänger-Themen 6
H Mouse- und KeyListener Probleme? Java Basics - Anfänger-Themen 5
A Probleme beim zykl. aktulisieren von Daten in JTable Java Basics - Anfänger-Themen 3
I Probleme bei Verzeichnissanalyse Java Basics - Anfänger-Themen 12
F Probleme mit privaten Klassen (abstrakten Klassen) Java Basics - Anfänger-Themen 1
H Probleme mit Klassen...oder: Eine Uhr Java Basics - Anfänger-Themen 9
G Probleme mit Konsole Java Basics - Anfänger-Themen 4
S Probleme mit GamGrid Spiel-Erstellung => Actor reagiert nicht auf Tastatur Java Basics - Anfänger-Themen 2
G Probleme mit Eclipse oder der URL Klasse Java Basics - Anfänger-Themen 5
W Verständnis Probleme bei der while-Schleife und continue Java Basics - Anfänger-Themen 21
M Probleme mit Anzeigen von String in GUI und if-Anweisung Java Basics - Anfänger-Themen 9
T Konstruktor Probleme Java Basics - Anfänger-Themen 3
W Methoden Probleme mit der Scanner Methode Java Basics - Anfänger-Themen 2
F Ja Nein Abfrage und andere Probleme Java Basics - Anfänger-Themen 5
L If Anweisung mit ArrayList Probleme Java Basics - Anfänger-Themen 6
littles_de Simbad Simulator probleme mit Sensordaten... Java Basics - Anfänger-Themen 0

Ähnliche Java Themen

Neue Themen


Oben