数组值在循环外部变化 - Java

时间:2017-02-01 17:23:08

标签: java

我有一个 2D ArrayList

private ArrayList<double[]> allNeuronsParams = new ArrayList<double[]>();

我正在尝试在循环中为其赋值:

for (int i = 0; i < getTotalNeuronNum(); i++) {

        allNeuronsParams.add(defaultParamCase1);        //this is fine

        setNeuronParam(i, 0, (double)NMassociatedNum);  //this is fine

        setNeuronParam(i, 1,extractedNeuronTypes[i]);   //this is the problem
    }

问题在于我在循环中的最后一次分配:

        setNeuronParam(i, 1,extractedNeuronTypes[i]);

此行通过extractedNeuronTypes函数将allNeuronsParams数组中的值分配给setNeuronParam(row, index, value) 2-D ArrayList的每一行的第二个索引。

当我在循环中打印值时,一切都是正确的。但是当我在循环之后放置一个print语句时,这些值就不再正确了。

打印的值均为3,这是extractedNeuronTypes数组的默认值。在我的for循环之前,我调用另一个函数,打开一个文件并在这个数组中读取新值 - 不是对于所有索引,但是对于其中一部分,值会改变。例如,值从默认值{3,3,3,3}更改为新值{3,2,1,3}。

但由于某种原因,只能访问{3,3,3,3}。我再一次在循环中打印值,并将正确的数字{3,2,1,3}分配给2-D arrayList。

但这是我在循环后得到的结果 - 粗体数字是错误的,其他一切都很好:

  

我的参数是:1.0, 3.0 , - 1.0,-2.345,1.0,1432345.1,-13456.0,   -1.4,2.000003,2.000003,2.000003,2.000003

     

我的参数是:1.0, 3.0 , - 1.0,-2.345,1.0,1432345.1,-13456.0,   -1.4,2.000003,2.000003,2.000003,2.000003

     

我的参数是:1.0, 3.0 , - 1.0,-2.345,1.0,1432345.1,-13456.0,   -1.4,2.000003,2.000003,2.000003,2.000003

     

我的参数是:1.0, 3.0 , - 1.0,-2.345,1.0,1432345.1,-13456.0,   -1.4,2.000003,2.000003,2.000003,2.000003

有谁能看到我错在这里?

谢谢。

2 个答案:

答案 0 :(得分:0)

看起来你的所有行都引用了相同的数组(defaultParamCase1)。

而不是

    allNeuronsParams.add(defaultParamCase1);

您应该创建defaultParamCase2的深层副本,并将该副本添加到Arraylist

答案 1 :(得分:0)

好的 - 谢谢大家的帮助。我终于弄明白了问题所在。有些人实际上提到了这一点,虽然我花了一些时间才弄明白。

我想多次向arrayList添加相同的数组;但是,我不知道即使在这种情况下我们需要为arrayList的每一行创建新的空间 - 假设我的arrayList是2-D。

所以在我的方法开始时,我添加了以下行:

allNeuronsParams.add(new double[getNumOfParams(defaulParamFilePath)+2]);

在此之前,我使用了一个数组,并且我多次添加一个数组,因此所有引用都指向同一个数组,并且只保存和打印上一次迭代中的值。