HashMap-Problem

  • Themenstarter Themenstarter TheoD
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
T

TheoD

Gast
Hallo zusammen,

ich habe folgendes Problem....

ich habe mir wie folgt eine HashMap angelegt und diese dann gefüllt.

Code:
HashMap<Object a, Object b> = new HashMap<Object a, Object b>();

die Objekte besitzen folgende Attribute...

a(int i, String s, String st)
b(int ii, int iii, String str)

die hashMap kann ich nun auf dem Bildschirm ausgeben...

Code:
	public void print(){
		Iterator it = hm.entrySet().iterator();
		while (it.hasNext()){
		Map.Entry  entry = (Map.Entry)it.next();
		System.out.println(entry.getKey().toString() + 
				"--->" + entry.getValue().toString());
		}
	}

Bis dahin funktioniert alles wunderbar.
Wie kann ich jetzt aber nach einem Schlüssel suchen und dann den zugehörigen Wert ändern.
Im Netz finde ich nur immer Beispiele bei denen der Schlüssel ein String ist. Da brauche ich dann nur nach dem String zu suchen und kann dann den Wert ändern. Wie mache ich das aber bei Objekten?
Ich würde gerne ein Objekt a anhand eines Attributes finden (z.B. wenn int i = 5 ist) und dann im Objekt b etwas ändern.

Ich hoffe ich habe mein Problem einigermaßen verständlich ausgedrück 🙂
 
ja, und es geht nicht

erstens müssen deine Objekte equals und hashCode überschreiben

und wenn du einen Lookup nach einem Attribut des Keys machen willst, dann musst du

entweder eine zweite Map verwenden

oder (etwas langsamer)

durchs keySet iterieren und den richtigen Key finden, dann damit den Lookup machen
 
wo hast du gesucht ?

schau die API an... da du jedes Object als key verwenden kannst, kannst du auch mit diesen Objects per get() / containsKey() usw. nach den Werten suchen.

Einen Object als key, nach einem Attribut des Objekt zu suchen geht nicht (ohne komplettes iterieren)

mir erscheint dein komplette Map Struktur nicht logisch... warum Map<Object, Object>
und wenn du dann nach einem attribut suchst, warum nicht dieses attribut als key ?
 
Erstmal Danke für Eure Antworten!

Wahrscheinlich habe ich wirklich irgendwo einen Denkfehler.
Am Anfang sah meine HashMap so aus...
Code:
HashMap<String, Integer> hm = new HashMap<String, Integer>();
wobei String ein Name war und Integer eine Telefonnummer. Da hat alles prima funktioniert. Ich konnte einen Namen eingeben und habe die Nummer ausgegeben bekommen.
Daraufhin wollte ich das Ganze etwas erweitern, sodass ich als Key Name und Vorname habe und als Wert die Nummer und Vorwahl usw.
Deswegen habe ich den Namen und die Nummer jeweils in Objekte gepackt.

Object a Name
Object b Telefonnummer

Und nun würde ich gerne wieder einen Namen (z.b. den Vornamen) eingeben und daraufhin alle passenden Einträge in der HashMap mit dazugehörigen Wert ausgegeben bekommen.

In einem anderen Thread hier im forum habe ich etwas über equals und hashCode gelesen. Ich habe dann im Objekt Name equals und hashCode überschrieben. Der HashCode richtet sich jetzt nach int i. int i soll einfach eine fortlaufende Nummer sein. Das hat auch funktioniert. Der jeweilige hashCode zum Objekt Name ist jetzt der Wert der fortlaufenden Nummer. Allerdings habe ich noch nicht so ganz verstanden was mir das bringt :wink:

Wenn das Ganze so wie ich mir das Vorstelle nicht funktionieren kann werde ich mal nach einer anderen Möglichkeit suchen. Ich würde allerdings schon gerne eine HashMap benutzen. So wie es aussieht habe ich die Sache mit der HashMap noch nicht richtig verstanden. Würde ich aber gerne 🙂
 
Nutze OOP und erstelle dir eine Klasse, die dir diese Informationen speichert.

equals und hashCode sollte immer implementiert werden, so dass alle Möglichen Collection / Map Speicherungen auch wirklich funktionieren
 
Ich habe eine Klasse Name, eine Klasse Telefon und eine Klasse Telefonbuch.
In der Klasse Telefonbuch wird die HashMap<Name, Telefon> angelegt und gefüllt. In dieser Klasse hätte ich jetzt gerne eine Methode, die es erlaubt nach einem Key zu suchen.
Equals und hashCode habe ich in die Klasse Name gepackt.
 
Das funktioniert so leider nicht. Ich gebe die Namen und Nummern über einen InputStreamReader ein.

ungefähr so...


Code:
	BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
Name n = new name();
Telefon t = new Telefon();
String line1 = in.readLine();
n.setVorName(line1);
String line2 = in.readLine();
n.setName(line2);
        .
        .
        .
map.put(n, t);

Deswegen kann der mit map.get(Name n) nichts anfangen.
 
TheoD hat gesagt.:
Deswegen kann der mit map.get(Name n) nichts anfangen.
weswegen ?

du tust Objekte vom Typ Name als key in die map. Wenn diese Klasse equals bzw hashCode implementiert kannst du ohne Probleme über eine Instanz vom Typ Name den Wert in der Map holen, wenn dieser Schlüssel existiert
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben