2017-08-15 1 views
0

Ich konnte keine genaue Antwort auf dieses Problem finden, also werde ich mich nur fragen.Java: Erstellen einer neuen Karte mit den Informationen einer anderen Karte anstelle einer Referenz

Ich habe eine Map<Integer, State> states; mit Informationen über einen bestimmten Tag. Jeden Tag werden die Informationen dieses Tages in einer Map<Integer, DayLog> dayLog; gespeichert, wo das DayLog die gespeicherte Map<Integer, State> states; enthält.

Das Problem ist, wenn ich die Echtzeit ändern , alle gespeicherten in der dayLog ändert sich auch aufgrund einer erstellten Referenz und nicht neu erstellte Informationen.

Wie speichere ich die Informationen in einer neuen Map, anstatt nur eine Referenz zu erstellen?

Hoffe, das ist verständlich. Vielen Dank im Voraus! :)

+2

Bitte zeigen Sie die relevanten Teile des Codes, anstatt sie zu beschreiben –

Antwort

3

Sie benötigen eine tiefe Kopie tun, wenn Sie Ihre DayLog erstellen:

/** 
* Create a new DayLog object with the current set of states. 
* This constructor will make a deep copy of the states so they cannot be 
* changed later outside of this log. 
* @param currentStates the states as they exist right now 
*/ 
public DayLog(Map<Integer, State> currentStates) { 
    this.states = new HashMap<>(); 
    for(Integer key : currentStates.keySet()) { 
     State state = currentStates.get(key); 
     State newState = new State(state); // assuming copy constructor 
     this.states.put(key, newState); 
    } 
} 

Es könnte mehr Möglichkeiten, dies zu tun (Klon, ein state.archive() Verfahren mit, oder etwas), aber dies ist die grundlegende Methodik - Erstellen Sie eine Karte der Staaten, wie sie gerade existieren und lassen Sie keine Bezugnahmen auf die Live-Daten.

Alternativ verwenden Sie eine Datenbank - es ist wirklich gut, Sie wissen, Daten zu speichern.

+0

Sie könnten mit lambdas noch prägnanter sein. – duffymo

+0

Wahrscheinlich. Hab Java noch nie professionell gemacht, bevor Lambdas eine große Sache waren. Aber wenn jemand weiß, wie man das macht, werden sie sich ansehen, was das ist und "Oh yeah, kopiere Konstruktor, das ist was ich brauche!" und lege es in die Lösung, die sie verwenden. – corsiKa

+0

@duffymo Ich könnte es auch besser machen, indem ich 'this.states' nicht verstecke - es führt nur zu Fehlern, die es so machen, wie ich es dort gemacht habe. – corsiKa

0

Wie speichere ich die Informationen in einer neuen Karte, anstatt nur eine Referenz zu erstellen?

Sie können die HashMap mit dem Konstruktor erstellen, die ein Map als Parameter übernimmt:

public HashMap(Map<? extends K, ? extends V> m) 

Vom Javadoc:

Konstruiert ein neues HashMap mit den gleichen Zuordnungen wie die angegebenen Map .

Es wird alle Elemente in die neue HashMap setzen.

Dann löschen Sie die ursprüngliche Map: map.clear().

Wenn Sie dann Element in der ursprünglichen Map hinzufügen, wird es keine Nebenwirkung auf die gerade erstellte Map haben.

+0

Das wird das Problem jedoch nicht lösen. "Staat s = neuer Staat" (5); Map map = neue HashMap <>(); map.put (1, s); Map newMap = new HashMap (map); s.setState (6); System.out.println (newMap.get (1) .getState()); // druckt 6, nicht 5' – corsiKa

+0

Wenn Sie die anfängliche Karte nach der Instanziierung löschen, wird es. – davidxxx

+0

Warte, was? Nein, wird es nicht. Das Problem ist, dass außerhalb der Map jemand die Werte mutiert. Sie müssen den Zugriff der neuen Karte auf diese Werte unterbrechen, wenn Sie sie davon abhalten wollen, sie zu mutieren! Zeig mir einen MCVE, der deinen Standpunkt verdeutlicht. – corsiKa

Verwandte Themen