Vergleichen von Datensätzen

Status
Nicht offen für weitere Antworten.

daNny

Aktives Mitglied
Hallo Ihr da draussen! 😀

Ich wollte mich nun einmal in die Java-Welt begeben und mir so einmal ein Programm programmieren, welches ich hin und wieder mal gebrauchen könnte. Das hätte also nicht nur den Vorteil, dass ich auch mal mit Java etwas realisieren kann, sondern auch gleich einen praktischen Nutzen. Es geht also um folgendes:

Ich habe mehrere Excel-Tabellen, in denen Daten stehen. Diese sehen z.B. ungefähr so aus:

Tabelle1
Name | Email | Punkte | ... (weitere Spalten)
Bert | bert@yahoo.de | 10 | ...
Ernie | ernie@gmx.de | 9 | ...
Oscar | o@tonne.de | 11 | ...

Tabelle2
Email | Name | Punkte | ... (weitere Spalten)
Ernie | ernie@gmx.de | 9 | ...
Bert | bert@yahoo.de | 20 | ...
Kermit | kermit@frosch.de | 11 | ...

Die Tabellen können also ungefähr so aussehen.
Das auslesen in Java stellt auch garkein Problem dar. Habe mir jetzt JExcel ein wenig angeschaut, sodass ich damit klar komme.

Ich möchte diese unterschiedlichen Datensätze nun filtern, d.h., ich gebe eine Spalte an, die mir sozusagen als Schlüsselspalte dienen soll, was z.B. der Name wäre. Jetzt können folgende Fälle auftreten:

  • Der Name existiert in beiden Tabellen
  • Der Name existiert in Tabelle1
  • Der Name existiert in Tabelle 2

Wenn der Name nur in einer Tabelle existiert, sollen die Daten nun quasi in eine Liste eingetragen werden "Existiert nur in Tabelle1", "Existiert nur in Tabelle2".

Gibt es den Namen in beiden Tabellen, so sollen die Datensätze in eine weitere Liste eingetragen werden. Und genau diese Datensätze möchte ich nun weiter untersuchen, d.h. sagen "Untersuche, ob der Wert von Spalte 3 (Punkte) aus Tabelle1 mit dem von SPalte 3 aus Tabelle 2 übereinstimmt.

Die Frage die sich mir nun stellt ist, wie ich das ganze angehen soll. Ich habe mir zunächst überlegt, eine einzelne Klasse "Datensatz" anzulegen, die ein Array aus Strings beinhaltet, wo jedes Arrayelement dann der spalte einer Zeile entsprechen würde. Dann würde ich eine Collection, z.B. eine ArrayList aus diesen Datensätzen erstellen. Somit wäre dann der Inhalt aus einer Exceltabelle in einer ArrayList von Datensätzen. Das kann man dann natürlich für alle Dateien so machen, sodass jede Tabelle einer ArrayList<Datensatz> entsprechen würde.

Ist dieses Vorgehen wohl erstmal schlau? Ich möchte die einzelnen Datensätze dann natürlich vergleichen mit denen aus anderen ArrayListen. Ich müsste halt erstmal einen Ansatz finden, wie ich an dieses Problem rangehen könnte.

Ich hoffe, ich habe mich ansatzweise klar ausgedrückt.
 
Datensatz muß ja nicht unbedingt ein Array aus Strings beinhalten.
Könnte ja auch die Strings Name, emailAdresse, etc haben, (Hilfreich um diesen Datensatz weiterzuverwenden). Das andere wäre generischer.

Hier würde ich dann empfehlen equals zu überschreiben.

Naja für jede Tabelle eine ArrayList erstellen die dann im Speicher rumliegt, kann bei vielen Tabellen und grossen Tabellen störend wirken (wenn's nur die Sesamstrasse ist sollte das allerdings kein Problem darstellen).

Statt ArrayList, evtl HashSet verwenden. (keine Duplikate, Suchen über den Hash möglich)

Dafür dann aber nicht vergessen in Datensatz auch hashCode überschreiben (Diesen würde ich dann nur vom PrimärSchlüssel abhängig machen).

Eine andere Möglichkeit wäre eine Map zu erstellen in die der Datensatz eingetragen wird (Key), und eine Liste oder ein Set von Tabellen in denen dieser Datensatz vorkommt.

Code:
for(Datensatz datensatz : datensätzeauslesenausTabelle(tabelle))
{
if(hashmap.get(datensatz)==null){
Set set = new HashSet();
hashmap.put(datensatz, set);
}
hashmap.get(datensatz).add(tabelle);
}

Auswertungen dann entweder on the fly machen oder zwischencachen.
 
Schonmal danke für deine Antwort.

Hatte am Anfang auch daran gedacht, die einzelnen Werte eines Datensatz in Objekt-Eigenschaften zu speichern, aber dann tritt ja das Problem auf, dass ich vorher nicht genau weiß, wieviele Spalten die Tabelle hat. Somit weiß ich dann auch leider nicht alle Attribute, die ich in der Klasse definieren muss. Deswegen dachte ich dann daran, dem Datensatz einfach als Attribut ein String-Array zu geben, welches dann die Spalten der Tabellenzeile beinhaltet.

Ich denke, dass ich mich wohl ein wenig mit den Collections befassen sollte.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben