【发布时间】: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