Ordnung Maps

nrg

Top Contributor
Hallo Zusammen,

ich arbeite derzeit an einem Tool mit ini4j. Die INI-Datei wird ja in Hash bzw. MultiHashMaps eingelesen. Nun habe ich da auch Feldnamen. Wenn ich mir jetzt eine Sektion mit Feldnamen hole, erhalte ich eine ganz normale Map<String, String>. Diese Map möchte ich jetzt durchlaufen. Dabei ist mir aufgefallen, dass die ursprüngliche Ordnung dabei teilweiße flöten geht.

Option 1:
Java:
for (Entry<String, String> entry : map.entrySet())

Hierbei kommen die Elemente durcheinander.

Option 2:
Java:
Set<String> fieldNames = map.keySet();
Collection<String> values = map.values();

Damit bleiben die Elemente in der ursprünglichen Ordnung (analog ini.datei). Die Vorgehensweiße keys und values zu trennen entspricht auch meinem Programmablauf (benötige Anfangs 1x die Keys und dann Xmal die Values).

Nun zu meiner Frage: Ich glaube mich wage daran erinnern zu können, dass bei Maps die ursprüngliche Ordnung nicht gewährleistet ist. Kann ich mich jetzt darauf verlassen, dass sie
entweder der Ordnung der Ini-Datei entsprechen
oder zumindest das key/value Mapping anhand der Indexe des Sets und der Collections bestehen bleibt (davon gehe ich mal 100% aus, weil es anders keinen Sinn machen würde ;)).

Danke schon mal und Grüße
Andi
 
S

SlaterB

Gast
gehe einfach von gar nix aus, wieso solltest du?
alle Sets haben beliebige Sortierung, auch bei zwei Aufrufen hintereinander potentiell unterschiedlich,
die Reihenfolge der Keys hat nichts mit denen der Values zu tun,
mit dem Annahmen kann du nichts falsches mehr bauen ;)

wenn du eine Reihenfolge brauchst, dann sammle doch die Keys nebenher in einer Liste, oder verwende spezielle Maps die das können,
in der API gibts LinkedHashMap
 

nrg

Top Contributor
Naja, wenn aber ini4j zuvor schon das Zeug durcheinanderwirft, habe ich ja kaum ne Möglichkeit die Ordnung zu behalten.

ich muss mich ja irgendwo darauf verlassen können, dass die Ordnung gleich bleibt. Bei obiger Option 2 sah das auf den ersten Blick gut aus. Ordnung in fieldNames == ini == values. Mir bringt das jetzt aber nicht viel, wenn das 1000 mal so läuft und beim 1001x ist das durcheinander :(.
 
B

bygones

Gast
oder zumindest das key/value Mapping anhand der Indexe des Sets und der Collections bestehen bleibt (davon gehe ich mal 100% aus, weil es anders keinen Sinn machen würde ;)).
Bei einem Set (was im Grunde auch nur eine Map im Hintergrund ist), kannst du nie von einer gewissen Sortierung ausgehen, egal wann und wie. Bei Collections schon.

normale Map<String, String>
das ist ja nur das interface... die Frage ist welche Implementierung wird genutzt...

warum brauchst du eigentlich genau die selbe Ordnung wie in der ini ?
und wenn - warum schreibst du in der ini nicht alles alphabetisch sortiert und lässt dann die Map nicht durch eine Sortierun auch alphabetisch erscheinen
 
S

SlaterB

Gast
nun, ich weiß nicht genau was du mit ini4j so anstellst,
im Zweifel sage ich da platt dass du die ganze API nicht verwenden kannst oder die Ini-Datei nebenher noch neu in eine Liste einlesen solltest

wenn du 100% Klarheit über die Implementierung der HashMap haben willst, dann schau doch im Quellcode nach,
mit 1200 Postings nicht zu viel verlangt? na, ich kann jedenfalls nichts mehr beitragen

edit:
> Bei einem Set [..] kannst du nie von einer gewissen Sortierung ausgehen, egal wann und wie. Bei Collections schon.

bei List schon? jedes Set ist auch eine Collection
 

Marco13

Top Contributor
Du könntest ggf. posten, wie genau du diese Map erstellst. Allerdings ist die API von Ini4j GAR NICHT dokumentiert. Vieles mag selbsterklärend sein, aber sowas eben nicht...
 

Landei

Top Contributor
Da INI-Dateien ja gerade dafür gemacht sind, bequem editiert zu werden, halte ich es für falsch, von einer bestimmten Reihenfolge auszugehen (bei Properties übrigens genauso). Wenn du unbedingt eine bestimmte Reihenfolge brauchst, solltest du dir vielleicht ein eigenes Format überlegen (wie wäre es mit etwas XML-basierten?)
 

nrg

Top Contributor
naja in der Ini-Datei sind halt Feldnamen und Werte. Diese schreibe ich dann in eine Datei.

INI-Datei
Feldname1 = Wert1
Feldname2 = Wert2
Feldname3 = Wert3

Ausgabedatei:
Feldname1,Feldname2,Feldname3
Wert1,Wert2,Wert3

Es wäre schön, wenn diese in der Reihenfolge bleiben.

Fatal wäre es, wenn das Mapping durcheinander kommt:
Feldname3,Feldname1,Feldname2
Wert1,Wert2,Wert3

Notfalls kann ich naürlich einfach mit
for (Entry<String, String> entry : map.entrySet())
durchiterieren. Dabei geh ich sicher davon aus, dass das Key/Value-Mapping bestehen bleibt.

Dann würde halt z.B. sowas rauskommen:
Feldname3,Feldname1,Feldname2
Wert3,Wert1,Wert2

Das wäre - wie gesagt nofalls - auch ok.

Ich habe jetzt einen Test durchlaufen lassen. Die Feldnamen hole ich mir mit:
Set<String> fieldNames = map.keySet();
Damit initialisiere ich meinen Header und hole mir dann die Values:
Collection<String> values = map.values();

Ausgabedatei:
Feldname1,Feldname2,Feldname3
Wert1,Wert2,Wert3

Das wäre natürlich perfekt aber wenn ihr sagt, dass ich mich nicht 100% darauf verlassen kann, nimm ich ein entrySet()
 
S

SlaterB

Gast
beide Sets Keys + Values gleichzeitig zu durchlaufen ist in der Tat Irrsinn,
wenn nicht EntrySet, dann ist das übliche Vorgehen, das KeySet zu durchlaufen und zu jedem Key über die Map den Value zu holen,
aber auch nur alles auf einmal, nicht an anderer Stelle das KeySet ein zweites Mal holen und hoffen dass es noch dieselbe Reihenfolge hat
 

nrg

Top Contributor
ok gut. die Aussage, die ich hören wollte, habe ich jetzt öfters bekommen. Ich kann mich nicht 100% auf eine natürliche ordnung verlassen. Dann mache ich es anders. Vielen Dank euch allen
 

Ähnliche Java Themen

Neue Themen


Oben