2016-05-16 37 views
0

Ich habe ein Map-Objekt, in dem Ganzzahlen als Schlüssel und Listen als entsprechende Werte verwendet werden. Hier ist mein Code.HashMap-Werte werden nicht aktualisiert

Map<Integer, List<Double>> dataDouble = new HashMap<Integer, List<Double>>(); 
List<Double> dubList = new ArrayList<Double>(); 
for(double i = 0; i < 10; i++) 
    dubList.add(i); 

dataDouble.put(1, dubList); 
//dubList.clear(); 

for(int i = 10; i < 16; i++) 
    dubList.add(i); 

dataDouble.put(2, dubList); 

Set<Integer> keyset = dataDouble.keySet(); 

for(Integer key : keyset) { 
    System.out.println("\t\tKEY: " + key); 
    List<Double> finList = dataDouble.get(key); 
    for(double value : finList) 
     System.out.println("VALUE: " + value);  

    } 
} 

Wenn ich beinhalten nicht die klare Aussage dann die zweite Liste nicht aktualisiert wird, und ich bekomme 2 Block von 1 bis 10 in den Druckanweisungen. Wenn ich den Löschbefehl hinzufüge, wird nur 10-15 in den zwei Blöcken gedruckt.

Meine Frage ist, warum löscht der Befehl clear löschen Daten bereits zur Karte hinzugefügt, und auch warum ändert das Hinzufügen neuer Daten zu der Liste und das Setzen auf der Karte nicht tatsächlich die Werte?

Edit: Ich weiß, ich bin mit Doppel statt int, die ich in meinem aktuellen Projekt mit Double-Werten befasse

+0

Listen sind Objekte. Sie erstellen immer nur eine Liste 'dubList'. Egal, wie oft Sie es zu "dataDouble" hinzufügen, es wird das gleiche Objekt, die gleiche Liste sein. –

+0

Also die Werte in der Karte sind nicht wirklich festgelegt, stattdessen nur auf das Objekt selbst zeigen? –

+0

@PeytonC. Korrekt, da es auf eine Referenz des Objekts zeigt, wenn Sie es der Liste hinzufügen, fügen Sie einfach den Verweis auf die 'ArrayList' namens' dubList' hinzu, die 0-15 enthält, da Sie nie eine neue 'ArrayList initialisiert haben '. – Orin

Antwort

2

Sie sind nicht ein anderes ArrayList unter den verschiedenen Tasten in den HashMap setzen. Sie setzen die gleicheArrayList unter jedem. Das bedeutet, dass jede Änderung, die daran vorgenommen wird, sich in allen widerspiegelt (da sie alle dasselbe Objekt sind). Wenn Sie mehrere verschiedene List s haben möchten, müssen Sie eine neue miterstellen. Ersetzen Sie also die Zeile, in der Sie clear es mit dubList = new ArrayList<>(), und es wird Ihnen eine neue Instanz korrekt geben.

2

Sie sind für alle Einträge das gleiche Objekt mit Ihnen auf der Karte hinzugefügt sind.

Ändern Sie nach dem Hinzufügen die List, auf die die Referenz verweist.

dataDouble.put(1, dubList); 
dubList = new ArrayList<>(); <--- HERE 

for(int i = 10; i < 16; i++) 
    dubList.add(i); 
1

Sie verwenden einen Verweis auf dieselbe ArrayList namens dubList und fügen diesen Verweis zweimal auf Ihre Map hinzu. Sie müssen zwei separate ArrayList Deklarationen haben.

Map<Integer, List<Double>> dataDouble = new HashMap<Integer, List<Double>>(); 
List<Double> dubList = new ArrayList<Double>(); 
for(double i = 0; i < 10; i++) 
    dubList.add(i); 

dataDouble.put(1, dubList); 

//add a new ArrayList 
List<Double> dubList2 = new ArrayList<Double>(); 

for(int i = 10; i < 16; i++) 
    dubList2.add(i); 

dataDouble.put(2, dubList2); 

Set<Integer> keyset = dataDouble.keySet(); 

for(Integer key : keyset) { 
    System.out.println("\t\tKEY: " + key); 
    List<Double> finList = dataDouble.get(key); 
    for(double value : finList) 
     System.out.println("VALUE: " + value); 
    } 
} 
Verwandte Themen