Beziehungen zwischen HashMaps

  • Themenstarter Themenstarter Michael0815
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
M

Michael0815

Gast
Hallo zusammen,

ich versuche mir gerade ein kleines Programm zu erstellen.

Dazu möchte ich 2 Tabellen, und die dazugehörige Beziehungstabelle importieren.
(sind derzeit noch Textdateien - wird später mal ne DB)

Die beiden Haupttabellen klappen gaz gut - da nehme ich jeweils eine HashMap und den Primärschlüssel der Tabelle als Key.
Nur wie kann ich die Beziehungstabelle in Java realisieren?
Es sollen m zu n Beziehungen möglich sein, und daher scheiden Maps an der Stelle ja aus, da ich keinen Schlüssel doppelt verwenden kann.

Ich hab schon an n einfaches 2-dimensionales String-Array gedacht (das ließe sich dann auch leicht befüllen) - nur ist es hier halt umständlich zu überprüfen, ob eine bestimmte Schlüssel-Schlüssel-Kombination auch vorhanden ist.

Gibt es da auch ne effektivere Möglichkeit?

Danke und Gruß,
Michael
 
die Beziehung direkt in die WertObjekte aufnehmen

als Referenz!

nach dem Motto

Autor autor = Buch.getAutor();
 
@Bleiglanz
die Beziehung direkt aufnehmen geht ja leider nicht, da es sich um m zu n - Beziehungen handelt (ein Buch mit mehreren Autoren)...

@Sebastian
ArrayList sieht ganz gut aus - und dann Kontrolle über einen Iterator und contains()...werd ich morgen früh mal testen.

Danke und Gruß, Michael
 
die ArrayList will dann doch nicht ganz so - ich glaub, ich hab da n ziemlichen Denkfehler.

mit
Code:
bezListe.add(new BezEintrag(aid,bid));
lege ich einen neuen Eintrag in der Liste der Beziehungen an.

Später will ich dann testen, ob eine bestimmte Beziehung in der Liste vorhanden ist, und mache das über
Code:
bezListe.contains(new BezEintrag(aid,bid))
Das funktioniert aber nicht (liefert immer false).

Kann das überhaupt funktionieren, wenn ich bei der Kontrolle ein neues BezEintrag-Objekt erzeuge und zum Vergleich nutze?

Gruß, Michael
 
wahrscheinlich bist du schneller dran, wenn du ein paar Stunden in Hibernate investierst, das würde dir
Code:
Collection c = buch.getAutoren();
automatisch liefern

derart O/R-Mapping von Hand zu machen ist nicht direkt schön oder interessant (weils eben schon so viele gemacht haben...)
 
Hibernate werde ich dann auch nutzen, sobald die Datenbank dahinter steht...

bin nur gerade n bisschen am einarbeiten in JAVA - und da probier ich gerne so kuriose Sachen 😉

hab's jetzt ganz einfach über ein TreeSet realisiert, dessen Objekte jeweils eine Zusammensetzung aus aid&bid sind - keine ideale Lösung, aber zum Testen reichts...

Danke für die Denkanstöße - Michael
 
bezListe.contains(new BezEintrag(aid,bid)) kann natürlich nicht funktionieren. Contains prüft ob das übergebene Objekt in der Liste enthalten ist - wenn du es dort per new erzeugst, kann es ja nicht in der liste existieren... du musst dann schon dasselbe objekt halten.

Die einzige Möglichkeit wäre da per return .equals jedes Objekt der Liste zu vergleichen.
 
SnooP hat gesagt.:
bezListe.contains(new BezEintrag(aid,bid)) kann natürlich nicht funktionieren. Contains prüft ob das übergebene Objekt in der Liste enthalten ist - wenn du es dort per new erzeugst, kann es ja nicht in der liste existieren... du musst dann schon dasselbe objekt halten..
nicht ganz richtig...

Die Klasse muss die Methode equals ueberschreiben (bzw bei hashed Collections nocht hashCode), dann geht das ohne Probleme

Code:
public class Test {
	public static void main( String[] args ) {
		Collection c = new ArrayList();
		c.add( new T( "1", "2" ) );
		System.out.println( c.contains( new T( "1", "2" ) ) );
	}
}

class T {
	public T( String s, String t ) {
		this.s = s;
		this.t = t;
	}
	
	public boolean equals(Object o) {
		if(!(o instanceof T)) {
			return false;
		}
		T tt = (T)o;
		return s.equals(tt.s) && t.equals(tt.t);
	}

	String s;
	String t;
}
liefert true....

d.h. contains ueberprueft nicht, ob es das selbe Object ist, aber ob es das gleiche ist !
 
@Sebastian
den Spaß werd ich bestimmt haben (endlich was, das ich schon beherrsche - SQL 😉 ) - aber die Probleme kommen sicher auch.

@SnooP
sowas dachte ich mir, deshalb bin ich jetzt auf das TreeSet umgestiegen und simuliere mir meine RDB mit m-zu-n-Beziehung durch 3 Textdateien 🙂

@DbaC
das verstehe ich jetzt nicht ganz.
Ich überschreibe die equals()-Methode, und dadurch funktioniert dann auch contains() anders?
also geht contains() einfach alle Objekte der Reihe nach durch, und vergleicht sie mit equals() mit den Vorgabewerten?

Gruß, Michael
 
Michael0815 hat gesagt.:
@DbaC
das verstehe ich jetzt nicht ganz.
Ich überschreibe die equals()-Methode, und dadurch funktioniert dann auch contains() anders?
also geht contains() einfach alle Objekte der Reihe nach durch, und vergleicht sie mit equals() mit den Vorgabewerten?
contains geht im Prinzip durch die Collection und überprüft per equals, ob das aktuelle Element gleich dem Parameter ist.

D.h. wenn du mit eigenen Klassen arbeitest, musst du die equals Methode überschreiben, so dass ein Aufruf von contains dir das richtige Ergebnis zurückgibt
 
Wichtig: überschreib IMMER hashCode wenn du equals überschreibst!

das eine zu tun und das andere zu lassen (weil etwa im Moment keine "hashed" Collections zum Einsatz kommen usw.) wäre ganz ganz schlechter Stil
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben