Discussion:
Probleme mit komplexem HashMap
(zu alt für eine Antwort)
w***@sunrise.ch
2017-05-13 13:01:58 UTC
Permalink
Hallo zusammen

Ich habe ein Problem zu einem komplexeren HashMap. Der Output erfolgt nicht wie gewünscht aus mir unerklärbaren Gründen. Ich wäre sehr dankbar, wenn mir jemand helfen würde, ich stehe mit diesem Problem an.
Anmerkung: Es wurde bewusst nur eine einzige List Variable valSet verwendet und nicht deren zwei.

Der Output ist folgender:
-------------------------
Key = 1
Values = [Bat, Banana]
Key = 2
Values = [Bat, Banana]


Gewünschter Output ist jedoch folgender:
----------------------------------------
Key = 1
Values = [Apple, Aeroplane]
Key = 2
Values = [Bat, Banana]



********************* verwendetes Programm ****************************

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class HashMaps {

public static void main(String[] args) {

Map<Integer, List<String>> map = new HashMap<Integer, List<String>>();
List<String> valSet = new ArrayList<String>();

valSet.add("Apple");
valSet.add("Aeroplane");

map.put(1, valSet);
valSet.clear();

valSet.add("Bat");
valSet.add("Banana");

map.put(2, valSet);

for (Map.Entry<Integer, List<String>> entry : map.entrySet()) {
Integer key = entry.getKey();
List<String> values = entry.getValue();
System.out.println("Key = " + key);
System.out.println("Values = " + values );
}
}
}
Lothar Kimmeringer
2017-05-13 20:09:42 UTC
Permalink
Post by w***@sunrise.ch
Anmerkung: Es wurde bewusst nur eine einzige List Variable
valSet verwendet und nicht deren zwei.
Wenn du die gleiche Instanz von List in die Map setzt, brauchst
du dich nicht zu wundern, wenn du ein und die selbe List als
Value des Map-entry erhaelst.
Post by w***@sunrise.ch
List<String> valSet = new ArrayList<String>();
valSet.add("Apple");
valSet.add("Aeroplane");
map.put(1, valSet);
valSet.clear();
Damit loescht du die Eintraege in der List, die als Value in
der Map enthalten ist. Wuerdest du hier deine Ausgaberoutine
durchfuehren, wuerdes du ein [] als Wert der Liste hinter
Key(1) sehen.
Post by w***@sunrise.ch
valSet.add("Bat");
valSet.add("Banana");
map.put(2, valSet);
Damit setzt du die gleiche Liste, die schon bei Key(1) in der
Map liegt fuer Key(2).

Nachdem du es bewusst so gemacht hast, weiss ich nicht, ob es
viel hilft zu sagen, dass du eine neue Liste erzeugen musst,
statt die eine nur zu leoschen und neu zu befuellen.

Was ist denn dein genauer Anwendungsfall?


Gruesse, Lothar
--
Lothar Kimmeringer E-Mail: ***@kimmeringer.de
PGP-encrypted mails preferred (Key-ID: 0x8BC3CD81)

Always remember: The answer is forty-two, there can only be wrong
questions!
Stefan Ram
2017-05-16 10:36:10 UTC
Permalink
Post by w***@sunrise.ch
map.put(1, valSet);
Der Aufruf von »put« fügt keine Kopie des Objektes »valSet«
in den abbildenden Behälter ein. Vielmehr wird nur eine
Referenz auf das Objekt »valSet« in den Behälter eingefügt.
Post by w***@sunrise.ch
map.put(2, valSet);
Hier wird erneut eine Kopie einer Referenz /auf das gleiche/
Objekt wie unter dem Schlüssel »1« eingefügt.

In Java enthalten Referenzvariablen keine Objekte sondern
/Adressen/ von Objekten (Zeiger). Beim Kopieren des Inhalts
einer Referenzvariablen werden daher keine Objekt, sondern
nur Adressen kopiert. Um ein Objekt zu kopieren, kann man in
Java, falls die Klasse es erlaubt, einen Kopierkonstruktor
oder »clone« oder eine speziellen Kopiermethode verwenden
oder ein Objekt mit geeigneten Argumenten erzeugen. Dabei
ist zu beachten, daß die Bedeutung von »kopieren« jeweils
individuell definiert werden muß (flach, tief, wie tief
genau ...).

Lesen Sie weiter auf narkive:
Loading...