Tabellenartige Speicherstrukturen

freez

Top Contributor
Guten Morgen,

ich möchte gern Daten in einer Art Tabelle im Arbeitsspeicher ablegen. Wenn ich bei Tante Google nach Begriffen wie 'in memory table' oä. suche, komme ich aber immer wieder auf Datenbanken (HSQLDB, JAVADB). Dies ist aber nicht wirklich das was ich benötige. Ich will weder sortieren, noch selektieren, noch mich mit SQL Statements plagen. Einfach nur Daten speichern. Und auslesen.

Wichtig wäre, dass ich dynamisch Zeilen UND Spalten ergänzen möchte. Diese möchte ich Zeilen- und Spaltenweise wieder auslesen können. Einzelne Zeilen und Spalten löschen wäre nett, aber komplett löschen würde fürs erste reichen. Gleichzeitig Lesen und Schreiben sollte möglich sein. Gleichzeitig von mehreren Stellen schreiben ist dagegen nicht nötig.

Was will ich speichern: Zahlen ... also int und double Werte. Aber es wäre durchaus OK, wenn ich die auch als Integer oder Double Objekte ablegen kann. Ein paar Tausend Zeilen können es durchaus werden und vielleicht 2-10 Spalten. Ich denke im Speicher dürfte man das noch problemlos ablegen können.

Es wäre auch schön, wenn man Spalten Namen geben könnte, aber das wäre nicht ganz so wichtig. Dies könnte ich mir auch separat in ner Map halten.

Soweit ich weiß, kann man mit Java SE sowas standardmäßig nicht abbilden, oder irre ich mich da? Bevor ich mich selbst an eine Implementierung mache hier mal eine konkrete Frage: Kennt jemand eine Lib mit der man sowas recht einfach realisieren kann?
 
M

Marcinek

Gast
Das ist doch einfach ein zweidimensionales Array/Map.

Entweder eine Map<String, Map<String,Integer>> oder Liste.
 

freez

Top Contributor
Ja, der Gedanke war auch schon da. Aber da habe ich kein Gerüst wie eine Tabelle mit Spalten. In jeder Zeile könnte es in dem Beispiel unterschiedliche Spalten geben.

HM: OK, ich müsste mich in dem Fall um die Verwaltung der Spalten kümmern, damit ich weiß, welche Spalten zur Verfügungen stehen. Sozusagen eine Klasse die den Zugriff sauber kapselt. Außerdem müsste ich mir Hilfsobjekte zum Zugriff auf alle Elemente einer Spalte und alle Objekte einer Zeile erstellen um durch sie iterieren zu können.

Kann man machen ... aber vielleicht hat jemand sowas schon mal gemacht und hat es als Lib zur Verfügung gestellt?
 

Volvagia

Top Contributor
Warum nutzt du nicht einfach ein x-beliebiges Object als Zeile? Jedes Object ist eine row und die Variablen davon sind die columns. Dann kannst du speichern was du willst und wieviel du willst. Die Eigenschaften werden ja wahrscheinlich pro row gleich bleiben, im Notfall kannst du dann auch noch mit Vererbung etc. tricksen.
 

freez

Top Contributor
Vielleicht kurz als Hintergrund:
Ich habe eine GUI mit JFreeChart. Diese empfängt über Netzwerk Daten, welche per LineChart visualisiert werden soll (Server). Das Programm sammelt einfach Daten mit Zeitstempel und mehreren Key:Value Paaren (Ein Datenpaket = eine Zeile = 1 * Timestamp + X * Key:Value). Jeder Key wird als Line im Chart angezeigt. Wenn ich nun im Client auf die Idee komme andere Daten übertragen zu wollen, müsste ich in der Server GUI die Schnittstelle ändern. Das möchte ich vermeiden indem die Server GUI automatisch anhand der Keys weiss, wie die Line's heissen. Somit muss ich nur im Client den Namen des Keys ändern.

Hier könnte die Frage auftauchen, wie oft dass denn vorkommen kann ... nun ja, es ist ein Testsystem, bei dem ich unter Umständen alle 5 Minuten andere Informationen visualisieren möchte. Und jedes mal Server GUI und Client updaten wäre da zu aufwendig. Das soll sozusagen ein individuelles Testwerkzeug sein, welches ich eigentlich nicht mehr anfassen muss.
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Das heißt, du willst den Server irgendwelche Daten schicken und er soll etwas damit tun, ohne zu wissen worum es sich handelt? Wird so wohl nicht gehen. Endweder du normst die Daten, damit er nicht zu wissen braucht worum es sich handelt oder du teilst es ihm mit und schreibst für jeden Datentype eine eigene Implementierung. Denn woher soll das Framework wissen, worum es sich dabei handelt?
 

freez

Top Contributor
Aber er hat doch alle Informationen. Und diese "Memory Table" soll das genormte Ergebnis sein. Die Keys sind die Spaltennamen und die Values werden in einer Zeile dem Timestamp zugeordnet. Der Server muss dann nur noch für jede Spalte eine Chart Line erzeugen und diese den Spaltennamen zuordnen.
 

HimBromBeere

Top Contributor
Wenn ich nun im Client auf die Idee komme andere Daten übertragen zu wollen, müsste ich in der Server GUI die Schnittstelle ändern.
Der Vorschlag von Volvagia geht doch trotzdem, du musst doch nur bei jeder Anfrage an den Server eine neue Tabelle erstellen mit unterschiedlichen Spalten. Dafür brauchst du nur eine
Code:
Map<ID, Row>
mit Row-Einträgen, eine Row ist widerum eine
Code:
Map<Schlüssel, Wert>

Kurzfassung: Anfrage an Server (beinhaltet Daten + Schlüssel --> Anlegen einer neuen Tabelle --> Zeichnen --> Antwort als Bild.

Verstehe das Problem ehrlich gesagt nicht wirklich.
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Das heißt also, du willst einfach ein paar Werte haben, die unter einen bestimmten Namen (Spaltenname) gespeichert werden soll? Damit wäre wohl wieder eine HashMap die Waffe der Wahl, wie es Marcinek vorgeschlagen hatte. Nur statt der doppelten Verlinkung würde ich ein eigenes Object je "innere" Map machen. Selbst wenn das am Ende nicht ganz so schnell läuft und etwas mehr RAM verbraucht halte ich den Code für lesbarer, was wohl das wichtigste ist.
 

freez

Top Contributor
Ich glaube ich mach es anders, da es scheinbar keine solche Implementierung gibt und mir eine eigene Implementierung dann doch zu aufwendig ist. Ich wollte diese Tabelle auch im Speicher haben um auf ganze Spalten auch Berechnungen durchzuführen (avg, sum usw.). Außerdem wäre ein Export nach csv / xls ohne weiteres möglich.
Darauf verzichte ich nun einfach und dann wird das ganze nämlich richtig simple:
JFreeChart stellt die Daten anhand eines XYDataSets dar, welches die Daten der einzelnen Line's in XYSeries Objekten hält: (Auszug aus Koders Code Search: LineChartDemo2.java - Java - LGPL)
Java:
private XYDataset createDataset() {
        
        XYSeries series1 = new XYSeries("First");
        series1.add(1.0, 1.0);
        series1.add(2.0, 4.0);
        series1.add(3.0, 3.0);
        series1.add(4.0, 5.0);
        series1.add(5.0, 5.0);
        series1.add(6.0, 7.0);
        series1.add(7.0, 7.0);
        series1.add(8.0, 8.0);

        XYSeries series2 = new XYSeries("Second");
        series2.add(1.0, 5.0);
        series2.add(2.0, 7.0);
        series2.add(3.0, 6.0);
        series2.add(4.0, 8.0);
        series2.add(5.0, 4.0);
        series2.add(6.0, 4.0);
        series2.add(7.0, 2.0);
        series2.add(8.0, 1.0);

        XYSeries series3 = new XYSeries("Third");
        series3.add(3.0, 4.0);
        series3.add(4.0, 3.0);
        series3.add(5.0, 2.0);
        series3.add(6.0, 3.0);
        series3.add(7.0, 6.0);
        series3.add(8.0, 3.0);
        series3.add(9.0, 4.0);
        series3.add(10.0, 3.0);

        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(series1);
        dataset.addSeries(series2);
        dataset.addSeries(series3);
                
        return dataset;
      
    }

Ich lege die Daten direkt in ein XYDataSet ab und übergebe es dann zum Visualisieren dem Chart. Damit habe den geringsten Aufwand, allerdings mit den oben beschriebenen Nachteilen.
 

freez

Top Contributor
Das heißt also, du willst einfach ein paar Werte haben, die unter einen bestimmten Namen (Spaltenname) gespeichert werden soll?
Naja, eher Spaltenname + Zeile => Wert. Mir ist aber grad nicht klar, wie dein Vorschlag das Problem mit dynamischen erweitern der Spalten helfen soll. Ich müsste mich doch trotzdem um die Verwaltung der Spalten kümmern, oder? Hast du ein kleines Beispiel, wie du es meinst?
 

freez

Top Contributor
Na und? Dann machst du eine update-Anfrage und fügst die neue Zeile in die gewünschte Tabelle ein.

OK, dann habe ich deinen Post nicht verstanden.

OK, grad noch mal gelesen: Dann hinterlege ich in jeder Row den Spaltennamen noch mal? Finde ich nicht gerade optimal.

Aber du hast mich auf eine Idee gebracht, wie es doch einfach umzusetzen wäre:
Beim ersten Auftreffen eines Datenpaketes werden die Spaltennamen einem Spaltenindex 0..x zugeordnet. Jede Zeile wird dann ein Array mit x Elementen, wo ich dann die x double (oder auch int) Werte anhand des Indexes abspeichere. Dieses Array fliegt ab in ne Liste. Somit kann ich durch die Liste und die einzelnen Arrays iterieren, kann einzelne Zeilen löschen, einzelne Spalten berechnen, exportieren und das XYDataset für JFreeChart generieren.

Was ich nicht kann (jedenfalls nicht ohne erhöhten Aufwand), ist eine Spalte ergänzen. Aber du hast mich auf eine Idee gebracht: Wenn eine neue Spaltenstruktur kommt, habe ich zwangsläufig eine Änderung im Client vorgenommen und verwerfe einfach die Tabelle und erzeuge eine neue Tabelle, die leer ist. Würde für mich gut funktionieren. Danke :) :) :)

manchmal denkt man einfach zu quer :bahnhof:
 

HimBromBeere

Top Contributor
Spalten kannst du doch auch ganz einfach hinzufügen, indem du einfach in deine Map einen neuen Schlüssel anhängst. Die Änderung musst du dann aber natürlich in deinen Rows überall mitführen, was eine gewisse Arbeit bedeutet. Die neu entsehenden Tabellenzellen kannst du ja mit Standardwerten füllen.
 

Volvagia

Top Contributor
In eine Map kannst du (theoretisch) beliebig viele Werte eintragen, entfernen, und per Key (z. B. Zahl oder String) blitzschnell an den Wert kommen.

Allerdings verstehe ich es auch nicht so wirklich.
 

Ähnliche Java Themen


Oben