Java hashmap在while循环之外是不同的

Java hashmap在while循环之外是不同的,java,hash,while-loop,hashmap,alias,Java,Hash,While Loop,Hashmap,Alias,我不知道为什么hashmap在这个while循环内部和while循环外部打印出不同的内容。我在while循环之外声明了映射,所以我假设它的内部和外部应该是相同的。在代码中,while循环内外都有相同的print语句,但它们打印的内容不同。映射的键是personCounter,它递增并且应该是唯一的。非常感谢你的帮助 public Map<Integer, double[]> setRating(CSVReader r, int taskNum, int taskWeightN

我不知道为什么hashmap在这个while循环内部和while循环外部打印出不同的内容。我在while循环之外声明了映射,所以我假设它的内部和外部应该是相同的。在代码中,while循环内外都有相同的print语句,但它们打印的内容不同。映射的键是personCounter,它递增并且应该是唯一的。非常感谢你的帮助

    public Map<Integer, double[]> setRating(CSVReader r, int taskNum, int taskWeightNumHeader) 
        throws NumberFormatException, IOException {
    String[] line;
    int personCounter = 0;

    Map<Integer, double[]> indivTaskRating = new HashMap<Integer, double[]>();
    while ((line = r.readNext()) != null) {
                    double[] perTaskWeight = new double[5];
        personCounter++;
        int multiplier = taskNum * 5;   
        perTaskWeight[2] = Double.parseDouble(line[taskWeightNumHeader + multiplier]);
        perTaskWeight[1] = Double.parseDouble(line[taskWeightNumHeader + multiplier + 1]);
        perTaskWeight[0] = Double.parseDouble(line[taskWeightNumHeader + multiplier + 2]);
        perTaskWeight[3] = Double.parseDouble(line[taskWeightNumHeader + multiplier + 3]);
        perTaskWeight[4] = Double.parseDouble(line[taskWeightNumHeader + multiplier + 4]);
        indivTaskRating.put(personCounter, perTaskWeight);
        for (int j = 0; j < 5; j ++) {
            System.out.println("personID: " +1+ ", rating: " +indivTaskRating.get(1)[j]);
        }       
    }
    for (int j = 0; j < 5; j ++) {
        System.out.println("personID: " + 1+ ", rating: " +indivTaskRating.get(1)[j]);
    }
    return indivTaskRating;
}
public Map setRating(CSVReader r、int taskNum、int tasknowtnumheader)
抛出NumberFormatException,IOException{
字符串[]行;
int personCounter=0;
Map indivTaskRating=newhashmap();
而((line=r.readNext())!=null){
double[]perTaskWeight=新的double[5];
personCounter++;
int乘数=taskNum*5;
perTaskWeight[2]=Double.parseDouble(行[taskWeightNumHeader+乘数]);
perTaskWeight[1]=Double.parseDouble(行[taskWeightNumHeader+multiplier+1]);
perTaskWeight[0]=Double.parseDouble(行[taskWeightNumHeader+乘数+2]);
perTaskWeight[3]=Double.parseDouble(行[taskWeightNumHeader+乘数+3]);
perTaskWeight[4]=Double.parseDouble(行[taskWeightNumHeader+乘数+4]);
indivTaskRating.put(个人计数器、相关重量);
对于(int j=0;j<5;j++){
System.out.println(“personID:+1+”,rating:+indivTaskRating.get(1)[j]);
}       
}
对于(int j=0;j<5;j++){
System.out.println(“personID:+1+”,rating:+indivTaskRating.get(1)[j]);
}
返回indivTaskRating;
}

您在地图中放置的每个条目中都使用相同的双数组。最后,它将为每个条目填充相同的值

您需要在while循环的每次迭代中重新分配数组以解决问题

while ((line = r.readNext()) != null) {
    double[] perTaskWeight = new double[5];

    // ....
}

您不断重复使用同一数组,因此实际上在每个循环(同时)覆盖其内容


您需要在while循环中创建一个新实例(
double[]perTaskWeight=newdouble[5];
)。

我猜
override:=override
所以我将perTaskWeight移动到while循环的内部,while循环中indivTaskRating.get(1)[j]的值会发生变化。如果数组进入垃圾收集,hashmap是否会复制该数组@assylias@cinnamontoast只要你的映射持有对数组的引用,它就不能被垃圾收集(不,映射不复制数组的内容,它只持有对数组的引用)。@assylias我如何修复它,以便indivTaskRating每次通过while循环时都存储不同的数组?我尝试在while循环中移动新实例。仍然更改的值不一致。@正如我(和另一个)的回答中所解释的,移动数组初始化:
double[]perTaskWeight=new double[5]在while循环中。现在您已经编辑了您的问题,现有的答案是无效的,这不是很有用。我建议您回滚编辑,尝试调试代码,如果找不到问题,请发布一个包含新信息的新问题。