2016-05-20 9 views
1

zu sagen ich habe ein Problem, dass ich nicht in der Lage bin zu verstehen ..HashMap Werte ändern, ohne sie zu

ich ein HashMap called wholeSetHistory bin Gebäude.

Ich baue eine HashMap mit den gleichen Schlüsseln und Werten, die wholeSetHistory hat, genannt wholeSetHistoryT.

In ähnlicher Weise erstelle ich zwei HashMaps called wholeSetRates, wholeSetRatesT

Alle HashMaps haben dieses Format HashMap<String, HashMap<String, Double>>.

Ich habe diese Funktion, die ein Zug

public void createTrainSet(HashMap<String, HashMap<String, Double>> wholeSetRates, HashMap<String, HashMap<String, Double>> wholeSetHistory){ 
    for(String fbid : wholeSetHistory.keySet()){ 
     ArrayList<String> locsBe = new ArrayList<>(); 
     HashMap<String, Double> locss = wholeSetHistory.get(fbid); 
     HashMap<String, Double> locss2 = wholeSetRates.get(fbid); 
     for(String loc : locss.keySet()){ 
      if(locss.get(loc)==1.0){ 
       locsBe.add(loc); 
      } 
     } 
     ArrayList<Integer> randomNums = new ArrayList<>(); 
     for(int i=0; i<2; i++){ 
      Random rn = new Random(); 
      int randomNum; 
      do{ 
       int range = locsBe.size() - 1 + 1;      
       randomNum = rn.nextInt(range); 
      }while(randomNums.contains(randomNum)); 
      randomNums.add(randomNum); 
      locss.put(locsBe.get(randomNum), 0.0); 
      locss2.put(locsBe.get(randomNum), 0.0); 
      wholeSetHistory.put(fbid, locss);  
      wholeSetRates.put(fbid, locss2); 
     } 
     randomNums.clear(); 
    } 
} 

Also, ich es wie dieses

(... creation of wholeSetHistory, wholeSetHistoryT, wholeSetRates, wholeSetRatesT) 
System.out.println(wholeSetHistory.get("1"));//1 
createTrainSet(wholeSetRatings, wholeSetHistory, nearUserIDWithVisitedTrueValues); 

bin mit später eingestellt erstellt, das bedeutet, dass ich auf die Funktion als Paramater bin vorbei nur wholeSetHistory

Obwohl ich später

System.out.println(wholeSetHistory.get("1"));//2 
System.out.println(wholeSetHistoryT.get("1"));//3 

Dieses, was passiert:

Die Werte, die auch in wholeSetHistory Änderungen in wholeSetHistoryT ändert! Zum Beispiel, Drucke 2 und 3 sind die gleichen (!) Und anders als 1.

Jede Hilfe ist mych geschätzt.

+0

Willst du damit sagen, dass du die gleichen Referenzen in zwei verschiedene Karten legst und wenn du sie in einer Karte änderst, ändert sie sie auch in der anderen? – ChiefTwoPencils

+0

ja! Die beiden Paare von Hashmaps haben die gleichen Schlüssel und Werte. –

+0

Wenn Sie den Wert eines Verweises auf ein Objekt in einer Karte ändern, wird dies auch in der anderen Karte entsprechend geändert. Probieren Sie einen Beispielcode aus, um zu testen, ob es tatsächlich so ist. –

Antwort

3

Ein Verweis verweist auf einen Speicherort im Speicher. Wenn Sie denselben Verweis auf zwei verschiedene Datenstrukturen hinzufügen, wird auch die Änderung des Verweises in einem anderen geändert. Sie zeigen auf das gleiche Objekt im Speicher.

+0

Sie sagen, dass, wenn zwei verschiedene hashmaps die gleichen Schlüssel haben, Sie den Wert in einem von ihnen nicht ändern können? Und wenn ja, was soll ich tun? Eine Methode oder etwas überstürzen? –

+2

Die Schlüssel sind eigentlich nicht wichtig. Wenn zwei verschiedene Schlüssel die gleiche Referenz wie ein Wert hätten, würden sie auch beide ändern. Was Sie brauchen, sind unabhängige Objekte, auf die Sie die beiden verschiedenen Referenzen verweisen können, wenn Sie das Verhalten nicht möchten. @IraklisBekiaris – ChiefTwoPencils

+0

Ja! Ich hab es geschafft. Ich danke dir sehr. Ich habe die Art geändert, wie ich wholeSetHistoryT erstellt habe. Ich habe eine neue hashmap erstellt, um sie als Wert zu verwenden und nicht die selbe, die ich auf wholeSetHistory gesetzt habe. Chears Kumpel :) –