Dateiformat zum Speichern von Map-Inhalt

Hallo, ich hab eine Map in der Form:

Kochbanane	1.33
Echte Limette	2.07
Rubus-Hybriden	2.67
Sanddorn	2.38
Kaffir-Limette	2.68
Sternfrucht	1.00
Kapstachelbeere	2.62
Stinkende Mango	0.70
Rosenapfel	0.81
Süße Granadilla	1.19
Kratzbeere	2.22
Mangostanfrucht	2.67
Jambolan	0.58
Asiatischer Blüten-Hartriegel	2.39
Weiße Sapote	2.83
Arazá	1.73
Coquino	1.56
Mirabelle	2.02
Annona	2.07
Mammiapfel	2.56
Japanische Pflaume	1.09
Pflaumen	2.04
Sudachi	1.87
Indische Jujube	2.31
Schlehbeere	1.06
Papaya	1.14
Japanische Aprikose	2.63
Europäische Birne	1.08
Quenepa	0.82
Allackerbeere	1.40
Birnen	2.89
Jujube	2.08
Erdnuss	0.88
Litschi	0.60
Marula	1.48
Dreilappige Papau	1.42
Guanabana	2.90
Röhren-Kassie	2.83
Boysenbeere	2.72
Chinotto	1.95
Kirschpflaume	0.70
Akee	1.12
Knorpelkirsche	2.55
Echte Beeren	1.24
Sauerkirschen	1.01
Durian	1.55
Bilimbi	2.23
Acerola	1.53
Mandel	2.42
Berberitze	1.38
Kwini	2.69
Pecannuss	0.77
Große Sapote	0.97
Maracuja	1.44
Andenbrombeere	2.42
Eberesche	1.96
Sammelsteinfrüchte	0.54
Maibeere	1.66
Johannisbrot	0.96
Jenipapo	2.35
Keppel	2.77
Herzkirsche	2.61
Kokosnuss	2.20
Mabolo	2.39
Zwetschge	1.31
Buschpflaume	1.95
Kumquat	2.81
Balsampflaume	1.31
Javaapfel	0.80
Pfirsich	0.72
Granatapfel	0.51
Jochelbeere	0.64
Rosella	1.63
Japanische Wollmispel	0.92
Sammelnussfrüchte	2.17
Lulo	1.29
Schwarze Johannisbeere	0.50
Dattel	2.20
Brasilianische Guave	2.08
Salak	1.04
Cashewnuss	1.57
Mahonie	1.00
Amla	2.17
Lucuma	0.58
Mispel	2.40
Nektarine	1.39
Grosella	2.16
Coquito	1.04
Großfrüchtige Moosbeere	1.85
Kiwi	0.55
Apfelkaktus	1.60
Kirschen	1.72
Satsuma	0.65
Pulasan	1.54
Jabuticaba	1.82
Langsat	2.71
Taybeere	2.61
Orange	2.79
Gewöhnliche Moosbeere	0.83
Breiapfel	2.60
Apfelbeere	1.16
Aprikose	2.71
Melone	1.04
Apfel	1.79
Bananen	1.73
Myrica rubra	1.33
Loganbeere	2.60
Guave	2.26
Himbeere	1.78
Echte Sauerkirsche	1.49
Preiselbeere	1.41
Pomeranze	1.60
Erdbeerguave	2.13
Gandaria	1.64
Erdbeere	1.33
Kohlpalmenfrüchte	2.57
Pitomba	1.71
Cempedak	1.55
Surinamkirsche	0.72
Affenbrot	2.95
Moltebeere	2.84
Bastard-Kirsche	2.73
Felsenbirne	0.98
Wasserapfel	0.65
Pfirsichpalmenfrucht	2.59
Pitahaya	1.71
Japanische Stachelbeere	0.93
Pepino	2.73
Scheinquitte	1.02
Binjai	2.73
Edelkastanie	0.91
Weinbeere	1.93
Gewöhnliche Limette	1.47
Stachelbeere	1.27
Zitronatzitrone	1.93
Curiola	0.60
Tamarinde	1.04
Yuzu	0.97
Kolumbianische Sapote	1.13
Kemirinuss	1.63
Echte Pflaume	1.07
Zimtapfel	2.43
Kornelkirsche	1.25
Pomelo	1.72
Burmesische Traube	1.19
Fensterblatt	1.29
Pampelmuse	2.50
Kaktusfeige	1.53
Hagebutte	1.62
Kiwano	0.73
Walderdbeere	1.51
Kaki	0.60
Zitrusfrüchte	1.02
beerenähnliche Früchte	0.65
Edel-Pflaume	0.71
Chilenische Guave	2.54
Gartenerdbeere	2.75
Santol (Pflanze)	1.85
Ugli	2.78
Elsbeere	1.87
Bergamotte	0.87
Riesen-Granadilla	0.89
Zitrone	1.59
Brotfrucht	2.14
Speierling	2.99
Lotusfrucht	0.64
Dovyalis	2.17
Japanische Weinbeere	2.30
Salmonberry	2.38
Jackfrucht	1.96
Echte Mehlbeere	2.62
Curuba	1.57
Atemoya	1.13
Umbú	0.60
Schwarze Sapote	1.01
Granadilla	2.70
Walnuss	1.02
Feige	0.81
Holunder	2.02
Süßkirschen	1.24
Malayapfel	0.90
Mango	2.61
Rambutan	2.43
Longan	0.93
Maulbeere	2.56
Paranuss	1.27
Ananas	2.23
Rote Johannisbeere	0.57
Nashi-Birne	0.95
Sternapfel	2.27
Westlicher Erdbeerbaum	1.19
Pistazie	1.14
Grapefruit	1.92
Cherimoya	1.02
Tamarillo	2.16
Mandarine	0.78
Mombinpflaume	1.46
Marionbeere	2.67
Babaco	1.06
Camu-Camu	0.88
Macadamia	1.34
Haselnuss	1.78
Brombeere	1.28
Quitte	1.40
Achachairú	0.98
Heidelbeere	0.70
map = {Kochbanane=1.33, Echte Limette=2.07, Rubus-Hybriden=2.67, Sanddorn=2.38, Kaffir-Limette=2.68, Sternfrucht=1.0, Kapstachelbeere=2.62, Stinkende Mango=0.7, Rosenapfel=0.81, Süße Granadilla=1.19, Kratzbeere=2.22, Mangostanfrucht=2.67, Jambolan=0.58, Asiatischer Blüten-Hartriegel=2.39, Weiße Sapote=2.83, Arazá=1.73, Coquino=1.56, Mirabelle=2.02, Annona=2.07, Mammiapfel=2.56, Japanische Pflaume=1.09, Pflaumen=2.04, Sudachi=1.87, Indische Jujube=2.31, Schlehbeere=1.06, Papaya=1.14, Japanische Aprikose=2.63, Europäische Birne=1.08, Quenepa=0.82, Allackerbeere=1.4, Birnen=2.89, Jujube=2.08, Erdnuss=0.88, Litschi=0.6, Marula=1.48, Dreilappige Papau=1.42, Guanabana=2.9, Röhren-Kassie=2.83, Boysenbeere=2.72, Chinotto=1.95, Kirschpflaume=0.7, Akee=1.12, Knorpelkirsche=2.55, Echte Beeren=1.24, Sauerkirschen=1.01, Durian=1.55, Bilimbi=2.23, Acerola=1.53, Mandel=2.42, Berberitze=1.38, Kwini=2.69, Pecannuss=0.77, Große Sapote=0.97, Maracuja=1.44, Andenbrombeere=2.42, Eberesche=1.96, Sammelsteinfrüchte=0.54, Maibeere=1.66, Johannisbrot=0.96, Jenipapo=2.35, Keppel=2.77, Herzkirsche=2.61, Kokosnuss=2.2, Mabolo=2.39, Zwetschge=1.31, Buschpflaume=1.95, Kumquat=2.81, Balsampflaume=1.31, Javaapfel=0.8, Pfirsich=0.72, Granatapfel=0.51, Jochelbeere=0.64, Rosella=1.63, Japanische Wollmispel=0.92, Sammelnussfrüchte=2.17, Lulo=1.29, Schwarze Johannisbeere=0.5, Dattel=2.2, Brasilianische Guave=2.08, Salak=1.04, Cashewnuss=1.57, Mahonie=1.0, Amla=2.17, Lucuma=0.58, Mispel=2.4, Nektarine=1.39, Grosella=2.16, Coquito=1.04, Großfrüchtige Moosbeere=1.85, Kiwi=0.55, Apfelkaktus=1.6, Kirschen=1.72, Satsuma=0.65, Pulasan=1.54, Jabuticaba=1.82, Langsat=2.71, Taybeere=2.61, Orange=2.79, Gewöhnliche Moosbeere=0.83, Breiapfel=2.6, Apfelbeere=1.16, Aprikose=2.71, Melone=1.04, Apfel=1.79, Bananen=1.73, Myrica rubra=1.33, Loganbeere=2.6, Guave=2.26, Himbeere=1.78, Echte Sauerkirsche=1.49, Preiselbeere=1.41, Pomeranze=1.6, Erdbeerguave=2.13, Gandaria=1.64, Erdbeere=1.33, Kohlpalmenfrüchte=2.57, Pitomba=1.71, Cempedak=1.55, Surinamkirsche=0.72, Affenbrot=2.95, Moltebeere=2.84, Bastard-Kirsche=2.73, Felsenbirne=0.98, Wasserapfel=0.65, Pfirsichpalmenfrucht=2.59, Pitahaya=1.71, Japanische Stachelbeere=0.93, Pepino=2.73, Scheinquitte=1.02, Binjai=2.73, Edelkastanie=0.91, Weinbeere=1.93, Gewöhnliche Limette=1.47, Stachelbeere=1.27, Zitronatzitrone=1.93, Curiola=0.6, Tamarinde=1.04, Yuzu=0.97, Kolumbianische Sapote=1.13, Kemirinuss=1.63, Echte Pflaume=1.07, Zimtapfel=2.43, Kornelkirsche=1.25, Pomelo=1.72, Burmesische Traube=1.19, Fensterblatt=1.29, Pampelmuse=2.5, Kaktusfeige=1.53, Hagebutte=1.62, Kiwano=0.73, Walderdbeere=1.51, Kaki=0.6, Zitrusfrüchte=1.02, beerenähnliche Früchte=0.65, Edel-Pflaume=0.71, Chilenische Guave=2.54, Gartenerdbeere=2.75, Santol (Pflanze)=1.85, Ugli=2.78, Elsbeere=1.87, Bergamotte=0.87, Riesen-Granadilla=0.89, Zitrone=1.59, Brotfrucht=2.14, Speierling=2.99, Lotusfrucht=0.64, Dovyalis=2.17, Japanische Weinbeere=2.3, Salmonberry=2.38, Jackfrucht=1.96, Echte Mehlbeere=2.62, Curuba=1.57, Atemoya=1.13, Umbú=0.6, Schwarze Sapote=1.01, Granadilla=2.7, Walnuss=1.02, Feige=0.81, Holunder=2.02, Süßkirschen=1.24, Malayapfel=0.9, Mango=2.61, Rambutan=2.43, Longan=0.93, Maulbeere=2.56, Paranuss=1.27, Ananas=2.23, Rote Johannisbeere=0.57, Nashi-Birne=0.95, Sternapfel=2.27, Westlicher Erdbeerbaum=1.19, Pistazie=1.14, Grapefruit=1.92, Cherimoya=1.02, Tamarillo=2.16, Mandarine=0.78, Mombinpflaume=1.46, Marionbeere=2.67, Babaco=1.06, Camu-Camu=0.88, Macadamia=1.34, Haselnuss=1.78, Brombeere=1.28, Quitte=1.4, Achachairú=0.98, Heidelbeere=0.7}
map.size() = 206

Also Früchte-und-Preise-Paare. Nun möchte ich diese Map gerne in einer Datei speichern - aber ich weiß nicht, in welchem Format. In welchem Format sollte man eine Map speichern, so dass sie evtl. auch erweitert werden kann? Und welche Library sollte man dafür benutzen? Ist so etwas auch mit google/gson/json möglich? Wenn ja, wie?

Hintergrund der ganzen Sache ist der, dass ich so eine Art Supermarkt wage simulieren möchte.

Danke für euren Rat.

Du hast so viele Möglichkeiten - einfache CSV-Dateien, JSON, eine relationale Datenbank (eventuell über Hibernate) u.s.w.

Der “direkteste” Ansatz wäre vermutlich, gleich eine “speicherbare” Map zu verwenden, z.B. von MapDB: database engine — MapDB

Mit gson ist es wirklich nicht so schwierig. Ich hab mich für
HashMap<String, ArrayList<Float>> map = new HashMap<String, ArrayList<Float>>();
entschieden. gson macht daraus “hübsches” json:
(alle Preise haben sich wieder geändert)

json:
[spoiler]{"Kochbanane":[1.7],"Echte Limette":[2.4],"Rubus-Hybriden":[2.68],"Sanddorn":[1.46],"Kaffir-Limette":[0.9],"Sternfrucht":[1.25],"Kapstachelbeere":[2.82],"Stinkende Mango":[1.51],"Rosenapfel":[1.33],"Süße Granadilla":[1.6],"Kratzbeere":[2.5],"Mangostanfrucht":[2.19],"Jambolan":[0.89],"Asiatischer Blüten-Hartriegel":[2.96],"Weiße Sapote":[1.04],"Arazá":[1.26],"Coquino":[2.58],"Mirabelle":[1.12],"Annona":[1.42],"Mammiapfel":[2.75],"Japanische Pflaume":[0.94],"Pflaumen":[2.8],"Sudachi":[1.41],"Indische Jujube":[2.22],"Schlehbeere":[1.8],"Papaya":[2.92],"Japanische Aprikose":[2.42],"Europäische Birne":[2.74],"Quenepa":[1.27],"Allackerbeere":[1.8],"Birnen":[0.93],"Jujube":[1.69],"Erdnuss":[0.92],"Litschi":[2.95],"Marula":[1.04],"Dreilappige Papau":[0.8],"Guanabana":[1.77],"Röhren-Kassie":[2.3],"Boysenbeere":[0.94],"Chinotto":[1.55],"Kirschpflaume":[1.84],"Akee":[1.2],"Knorpelkirsche":[1.99],"Echte Beeren":[2.8],"Sauerkirschen":[1.74],"Durian":[1.21],"Bilimbi":[2.42],"Acerola":[2.02],"Mandel":[1.86],"Berberitze":[1.64],"Kwini":[1.24],"Pecannuss":[1.28],"Große Sapote":[2.34],"Maracuja":[2.79],"Andenbrombeere":[1.93],"Eberesche":[2.24],"Sammelsteinfrüchte":[3.0],"Maibeere":[1.52],"Johannisbrot":[2.43],"Jenipapo":[1.74],"Keppel":[1.95],"Herzkirsche":[0.87],"Kokosnuss":[1.56],"Mabolo":[2.25],"Zwetschge":[2.43],"Buschpflaume":[0.73],"Kumquat":[2.74],"Balsampflaume":[2.85],"Javaapfel":[1.11],"Pfirsich":[2.94],"Granatapfel":[1.52],"Jochelbeere":[1.92],"Rosella":[1.04],"Japanische Wollmispel":[1.29],"Sammelnussfrüchte":[0.86],"Lulo":[1.15],"Schwarze Johannisbeere":[0.85],"Dattel":[2.72],"Brasilianische Guave":[2.39],"Salak":[1.83],"Cashewnuss":[2.89],"Mahonie":[2.18],"Amla":[0.75],"Lucuma":[2.91],"Mispel":[2.48],"Nektarine":[0.74],"Grosella":[1.33],"Coquito":[0.69],"Großfrüchtige Moosbeere":[1.17],"Kiwi":[2.87],"Apfelkaktus":[1.4],"Kirschen":[1.0],"Satsuma":[2.96],"Pulasan":[2.5],"Jabuticaba":[2.99],"Langsat":[2.75],"Taybeere":[0.72],"Orange":[1.22],"Gewöhnliche Moosbeere":[1.4],"Breiapfel":[0.91],"Apfelbeere":[0.77],"Aprikose":[0.6],"Melone":[1.58],"Apfel":[0.89],"Bananen":[0.94],"Myrica rubra":[2.05],"Loganbeere":[1.28],"Guave":[1.38],"Himbeere":[1.46],"Echte Sauerkirsche":[0.99],"Preiselbeere":[1.08],"Pomeranze":[1.68],"Erdbeerguave":[0.86],"Gandaria":[0.88],"Erdbeere":[0.65],"Kohlpalmenfrüchte":[2.77],"Pitomba":[0.92],"Cempedak":[1.01],"Surinamkirsche":[2.3],"Affenbrot":[0.94],"Moltebeere":[1.45],"Bastard-Kirsche":[2.39],"Felsenbirne":[1.09],"Wasserapfel":[1.81],"Pfirsichpalmenfrucht":[0.99],"Pitahaya":[2.98],"Japanische Stachelbeere":[1.06],"Pepino":[1.11],"Scheinquitte":[1.79],"Binjai":[2.95],"Edelkastanie":[2.12],"Weinbeere":[1.79],"Gewöhnliche Limette":[2.02],"Stachelbeere":[1.96],"Zitronatzitrone":[2.21],"Curiola":[1.99],"Tamarinde":[2.6],"Yuzu":[0.77],"Kolumbianische Sapote":[2.05],"Kemirinuss":[0.75],"Echte Pflaume":[2.27],"Zimtapfel":[1.16],"Kornelkirsche":[1.11],"Pomelo":[2.62],"Burmesische Traube":[1.26],"Fensterblatt":[0.93],"Pampelmuse":[0.95],"Kaktusfeige":[1.29],"Hagebutte":[1.83],"Kiwano":[1.44],"Walderdbeere":[2.84],"Kaki":[0.63],"Zitrusfrüchte":[0.65],"beerenähnliche Früchte":[1.68],"Edel-Pflaume":[1.5],"Chilenische Guave":[1.97],"Gartenerdbeere":[1.26],"Santol (Pflanze)":[1.88],"Ugli":[1.69],"Elsbeere":[1.49],"Bergamotte":[1.22],"Riesen-Granadilla":[0.82],"Zitrone":[1.69],"Brotfrucht":[2.13],"Speierling":[0.92],"Lotusfrucht":[1.59],"Dovyalis":[1.32],"Japanische Weinbeere":[2.39],"Salmonberry":[2.55],"Jackfrucht":[1.52],"Echte Mehlbeere":[1.17],"Curuba":[1.35],"Atemoya":[2.07],"Umbú":[2.27],"Schwarze Sapote":[2.41],"Granadilla":[0.87],"Walnuss":[1.29],"Feige":[1.86],"Holunder":[2.54],"Süßkirschen":[1.16],"Malayapfel":[2.11],"Mango":[2.77],"Rambutan":[0.98],"Longan":[2.96],"Maulbeere":[0.72],"Paranuss":[2.59],"Ananas":[0.78],"Rote Johannisbeere":[0.53],"Nashi-Birne":[1.33],"Sternapfel":[1.24],"Westlicher Erdbeerbaum":[0.87],"Pistazie":[2.8],"Grapefruit":[1.07],"Cherimoya":[2.21],"Tamarillo":[2.02],"Mandarine":[2.1],"Mombinpflaume":[2.44],"Marionbeere":[2.33],"Babaco":[2.44],"Camu-Camu":[1.3],"Macadamia":[0.53],"Haselnuss":[0.53],"Brombeere":[2.72],"Quitte":[1.8],"Achachairú":[1.5],"Heidelbeere":[1.52]}[/spoiler]

Einige Fragen hab ich aber noch dazu:

  1. wie kann ich mich in Hibernate einlesen?
  2. ist MapDB eine “echte” relationale Datenbank?
  3. was würdest Du an meiner Stelle dafür benutzen?

Edit: Kann ich gson irgendwie “dazu bringen”, das er alle Float-Werte so json schreibt: String.format(java.util.Locale.US, "%.2f", map.get(key).get(0))?

Was ist mit [japi]Properties[/japi]?

Warum ist die Value eine List? Da steht doch immer nur EIN Preis…!? Properties wären wohl das einfachste, portabelste, lesbarste (und dependency-ärmste).

Ja, genau ein Preis, aber ich möchte ja später noch Güteklasse oder Handelsklasse… N, O, P,… hinzufügen (Beispiel).

200 Einträge kann ein Mensch noch gut bearbeiten. Das Format sollte für Mensch lesbar sein und für das Rechner.

Was meinst du mit am dependency-ärmsten?

csv, xml, json, db, Properties wurden genannt.

Wie findet ihr Object serialization? Das würd nur mit der gleichen oder sogar nur mit derselben JRE funktionieren - oder?

dependency-arm - damit meint Marco13 sicher, dass deine Lösung von keinem weiteren Framework/API etc. abhängig sein wird, weil die Java-API Properties seit 1.0 anbietet.
Also können auch ältere JREs damit umgehen, wenn du den Compiler Level entsprechend setzt.

Serialisation ist auch noch möglich. Finde ich auch brauchbar, an anderer Stelle habe ich mal gelesen, dass sie langsam sein soll.
Wenn deine Klasse die Variable public static final long serialVersionUID = 1L; oder ähnlich erhält, sind deine serialisierten Objekte auch wiederherstellbar, wenn sich deren Code später geändert hat.
Allerdings denke ich, dass sie dann nur auf die JRE beschränkt ist, für die kompiliert wurde.

eine Map die dann eine Liste von verschiedene Attributen speichert… hat jemand das kleine OOP gesehen, ist irgendwie abhanden gekommen.

Bisher alles ungefähr Prototyp. dependency-arm hab ich jetzt verstanden. JRE-beschränkt jetzt auch. Danke dafür. Ich hätte ja gerne, dass sich sowohl die persistierten Daten ändern, wenn ich die Attribute der Klasse anpassen, als auch, dass sich die Klasse(n) ändern, wenn ich die Struktur der persistierten Daten anpassen. Aber das widerspricht doch der Definition einer Klasse und eines Objekts - oder nicht? Womit wäre das möglich?

[quote=CyborgBeta]Danke dafür. Ich hätte ja gerne, dass sich sowohl die persistierten Daten ändern, wenn ich die Attribute der Klasse anpassen, als auch, dass sich die Klasse(n) ändern,[/quote]Und ich hätte gerne der Schlüssel zum Haupttor der Playboy-Villa…

Aber mal im Ernst:
Wie sollen sich den die bereits persistierten Daten ändern, wenn Du Deine Klasse änderst?
Wann und wie soll den durch wen diese Magie vollbracht werden?

Die einzige Möglichkeit wäre eine Relationale Datenbank, in der Du dann deine Daten mittels Migrationsscript zum Zeitpunkt X anpassen musst, und danach können nur noch “neue” Programme damit arbeiten.

Es gibt zwar das Gerücht, dass man diese Migration bei (manchen) NO-SQL-DBs nicht bräuchte. Das stimmt zwar im Prinzip, aber das bedeutet eben auch, dass Deine Programme mit allen alten Datenstrukturen umgehen können müssen.

[quote=CyborgBeta;134364]als auch, dass sich die Klasse(n) ändern, wenn ich die Struktur der persistierten Daten anpassen[/quote]Genau dafür gibt es diverse Frameworks. Aber dafür muss man sich erst mal für eine “Persistent-Form” entschieden haben.

[quote=CyborgBeta;134364]Aber das widerspricht doch der Definition einer Klasse und eines Objekts - oder nicht?[/quote]Eigentlich nicht. Warum auch?

[quote=CyborgBeta;134364]Womit wäre das möglich?[/quote]Wie gesagt, hängt das vdavon ab, worin Du speichern willst.
Die schon angesprochenen Properties sind zwar simpel in der Anwendung, haben aber keine Unterstützung für Objektmapping.

Für XML gibts JaxB order CASTOR.

Für JSon gibts auch ein Framework, aber das finde ich persönlich nicht so lesbar wie XML.

Dierekte Serialisierung von Objekten funktioniert ohne “fremde Hilfe”, Was dann auf der Platte liegt ist aber nicht “human readable”.

bye
TT