2011-10-20 20 views
5

Ho problemi a ottenere una copia separata dei miei HashMaps. Con ciò intendo, una volta che ho fatto una copia dell'originale, apportare una modifica ad una non modifica l'altra.Comportamento HashMap Copia non riesco a capire

ho due HashMaps in questo formato:

HashMap<String, List<String> one = new HashMap<String, List<String>(); 
HashMap<String, List<String> two = new HashMap<String, List<String>(); 

chiamo la seguente funzione in basso (getTabSetDifferences) passando in uno e due, come previsto se ci sono alcune differenze, tali valori saranno rimossi dalla HashMap e sarà diverso da prima che fosse passato per il test.

voglio che rimangono invariati, così provato passsing in:

getTabSetDifferences((HashMap)one.clone(), (HashMap)two.clone()) 

Questo ancora cambiato gli originali, così ho creato altre due HashMaps nello stesso formato, e clonato uno e due di loro, ho usato le nuove hashmap per passare in e l'originale è stato ancora modificato.

Allora ho provato:

HashMap<String, List<String>> holdOne = new HashMap<String, List<String>>(); 
holdOne.putAll(one); 

HashMap<String, List<String>> Holdtwo = new HashMap<String, List<String>>(); 
holdTwo.putAll(two); 

Ora posso fare qualcosa di simile:

holdTwo.remove(key); 

e l'originale non è cambiato, ma se chiamo il metodo con holdOne e holdTwo Cambia ancora il uno o due hashmap originali, non dovrebbero rimanere? Il metodo funziona, e trovare le differenze che voglio e viene restituito. Ma ho ancora bisogno che le due hashmap originali siano come erano, ma non importa quale sia il modo che chiamo, qualsiasi cambiamento venga fatto per tenere premuto One e holdTwo cambia gli originali. È questo il comportamento previsto? In tal caso, qual è il modo corretto per ottenere una copia di una hashmap che non è legata ad essa.

getTabSetDifferences(holdOne, holdTwo); 

public HashMap<String, List<String>> getTabSetDifferences(HashMap<String, List<String>> hmMain, HashMap<String, List<String>> hmSecond) { 
    HashMap<String, List<String>> hmDifferences = new HashMap<String, List<String>>(); 
    for (Map.Entry<String, List<String>> entry : hmMain.entrySet()) { 
     if(hmSecond.containsKey(entry.getKey())) { 
      entry.getValue().removeAll(hmSecond.get(entry.getKey())); 
      if (entry.getValue().size() > 0) 
       hmDifferences.put(entry.getKey(), entry.getValue()); 
     } 
     else { 
      hmDifferences.put(entry.getKey(), entry.getValue()); 
     } 
    } 
    return hmDifferences; 
} 
+0

la spiegazione non è chiara. Non capisco cosa stai cercando di fare e come fallisce – Bozho

+0

Non fallisce davvero. Sto cercando di mantenere intatti i miei due HashMap originali. Il metodo getTabSetDifferences rimuove le differenze da una delle passate in HashMaps. Vorrei passare una copia, quindi l'originale è invariato, ma non riesco a capire come fare una copia, che non sia legata all'originale. – Green

risposta

2

Il metodo clone non esegue una copia profonda.

Hai 2 opzioni.

  1. creare un metodo di copia profonda.
  2. Utilizzare uno dei Mappa implementazioni del pacchetto java.util.concurrent come copy-on-write
+1

Ho scritto il mio metodo di copia profonda. funziona bene grazie per la direzione – Green

2

Sospetto che stiate copiando solo le chiavi/i valori. Questo non creerà copie degli elenchi.

Forse la MultiMap di Guava è quello che vuoi?

2

Se si copia la lista come una lista (cioè copiarlo a perimetro lista, piuttosto che qualche implementazione livello inferiore) , quindi il comportamento del puntatore verrà visualizzato .... Tuttavia, se si copia da una lista in una nuova lista, allora tali oggetti stringa sono indipendenti.

Il metodo clone di Java non deve essere utilizzato in attesa che restituisca copie distinte e profonde di un oggetto: l'immutabilità non è un concetto centrale del modo in cui il clone funziona.

Sono d'accordo con il commento di cui sopra: o utilizzare un multimap in una libreria come guava, o raccolte di google, o semplicemente fare molta attenzione alla copia, e copiare solo ai livelli primitivi, (non copiare mai una collezione e aspettarsi che sia indipendente) a meno che non l'abbia provato in modo esplicito.

Problemi correlati