【问题标题】:HashMap values are changing without telling them toHashMap 值在没有告诉他们的情况下发生变化
【发布时间】:2016-05-20 23:21:30
【问题描述】:

我有一个我无法理解的问题..

我正在构建一个HashMap called wholeSetHistory

我正在构建一个与 WholeSetHistory 具有相同键和值的 HashMap,称为 wholeSetHistoryT

以类似的方式,我创建了两个HashMaps called wholeSetRates, wholeSetRatesT

所有 HashMap 都具有这种格式 HashMap<String, HashMap<String, Double>>

我有这个函数可以创建一个火车组

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();
    }  
}

所以,以后我就是这样用的

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

这意味着我只作为参数传递给函数wholeSetHistory

虽然,后来我

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

会发生这种情况:

wholeSetHistory 中改变的值也在 WholeSetHistoryT 中改变! 例如,打印 2 和 3 与 1 相同(!)和不同。

感谢任何帮助。

【问题讨论】:

  • 您是说将相同的引用放在两张不同的地图中,当您在一张地图中更改它时,它也会在另一张地图中更改它?
  • 是的!两对哈希图具有相同的键和值
  • 将引用的值更改为一个映射中的对象也会在另一个映射中相应地更改它。尝试一些示例代码来测试它实际上是这样的
  • 您确定 locss 和 locss2 是不同的哈希映射,并且您没有传递相同的引用吗? WholeSetRates 和 WholeSetHistory 也一样?
  • 谢谢你们,我找到了解决方案!

标签: java hashmap training-data


【解决方案1】:

引用指向内存中的某个位置。如果您将相同的引用添加到两个不同的数据结构,更改其中一个引用也会更改另一个。它们指向内存中的同一个对象。

【讨论】:

  • 你是说如果两个不同的hashmap有相同的key,你不能改变其中一个的值?如果是,我该怎么办?覆盖一个方法或什么?
  • 键实际上并不重要。如果两个不同的键持有相同的引用作为一个值,它也会同时改变它们。如果您不想要遇到的行为,您需要的是独立的对象来指向两个不同的引用。 @IraklisBekiaris
  • 是的!我得到了它。非常感谢。我改变了创建 WholeSetHistoryT 的方式。我创建了一个新的哈希图作为值,而不是我在 WholeSetHistory 上的值。谢了伙计:)
  • @IraklisBekiaris,总是乐于提供帮助!
  • 另外,从现在开始很高兴知道;d
猜你喜欢
  • 2015-02-25
  • 1970-01-01
  • 2019-09-27
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
相关资源
最近更新 更多