Problem mit Referenz auf Map

Status
Nicht offen für weitere Antworten.

deetee

Aktives Mitglied
Also ich habe eine Art Multi Map mit diesem Aufbau:


Code:
Map<String, Map<Integer, ArrayList<String>>> _keyMap


Die innere Map ist quasi am anfang für alle gleich bzw. hat die selben Werte. Ich initialisiere die äußere Map mittels Schleife:


Code:
for
  _keyMap.put(key[i], someMap);
endfor


So, jetzt wird nach und nach aus manchen inneren Maps der Wert verändert, es wird ein Wert aus der ArrayList gelöscht, um genau zu sein.

Leider hab ich nun wohl das Problem, dass someMap eine Referenz ist in jeder Eintrag von keyMap, d. h. lösche ich aus key[2] einen Eintrag aus der ArrayList aus der inneren Map, dann haben auch alle anderen key[X] diese veränderte Map. Was nicht sein soll!


Wie löse ich das Dilemma am besten?

Danke!
 
Relativ einfach Lösung: Du musst dich drum kümmern, dass die Objekte vorm Einfügen geklont werden. Das ist zwar programmier- und laufzeitaufwendiger, aber relativ sicher.

Die Collections speichern eben nur die Referenz auf das eingefügte Objekt und duplizieren das Objekt nicht vorher (geht auch erstmal nicht).
Musst mal schauen, ob im Collections-Toolkit vllt. schon was vorgesehen ist, was dir bei deiner Arbeit hilft, ansonsten musst du eben den new-Operator und ggf. clone()-Methoden bemühen.
 
Es funktioniert leider nicht, wie gedacht. So erstelle ich die Map:


Code:
Iterator it = someMap.keySet().iterator();
            while (it.hasNext()) {
                Integer tmpKey = (Integer) it.next();
                ArrayList<String> tmpVals = (ArrayList<String>) someMap.get(tmpKey);

                tmpMap.put(new Integer(tmpKey), new ArrayList<String>(tmpVals));
            }

           // tmpMap = (LinkedHashMap<Integer, ArrayList<String>>) someMap.clone();

            this._keyMap.put(currentKey.toString(), new LinkedHashMap<Integer, ArrayList<String>>(tmpMap));

Dennoch sind alle ArrayList Listen verändert, wenn nur bei einer ein Wert gelöscht wird.

Ich versteh es nicht.
 
dein Programm enthält weder eine Änderung noch eine Überprüfung des Inhalts,
verständlich oder gar einfach oder zumindest ausführbar ist es auch nicht,
du hast zig verschiede Maps und Listen, es ist unklar um welche es geht,

so nun nicht 😉
 
Sorry, war etwas konfus. Habe die Namen angepasst.

Aber es geht offensichtlich jetzt doch. Ich habe ausversehen die auskommentierte Zeile in meinem code nicht auskommentiert gehabt und die Folge war, es wurde immernoch mit referenzen (trotz clone ?) gearbeitet.

Erst wenn ich die Zeile auskommentiere, dann wird ist der "Referenz Effekt" nciht mehr da.
 
Kannst du etwas mehr Code zur Verfügung stellen, etwa ein lauffähiges Beispiel mit einer Ausgabe, die auf den ungewollten Zustand hinweist? Bei solchen Map<Map<List>>-Konstrukten bekomm ich sonst Kopfschmerzen beim Code-Drüber-Gucken 😀

Da in der ArrayList Strings drinne stehen, gibt es dort erstmal keine Probleme bei Neuzuweisungen. Sprich:

Code:
		List<String> l1 = new ArrayList<String>();
		List<String> l2 = new ArrayList<String>();

		String s1 = "Wert 1";
		String s2 = "Wert 2";

		/* Listen bekommen das selbe Element */
		l1.add(s1);		l2.add(s1);
		
		/* keine Aenderung an Liste, da String immutabel ist */
		l2.set(0, s2);
		
		/* klappt */
		assert(l1.get(0).equals(s1));

Dein Code wird ein wenig besser lesbarer, wenn du die Java 1.5-Iteratoren nimmst, also z.B.

Code:
for (Integer tmpKey : _condHcRuleIdsMap.keySet()) {
	ArrayList<String> tmpVals = _condHcRuleIdsMap.get(tmpKey); /* ist ja typisiert, also brauchst du hier keinen Cast */
        ...
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben