我有一个 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
有谁能看到我错在这里?
谢谢。
答案 0 :(得分:0)
看起来你的所有行都引用了相同的数组(defaultParamCase1)。
而不是
allNeuronsParams.add(defaultParamCase1);
您应该创建defaultParamCase2的深层副本,并将该副本添加到Arraylist
答案 1 :(得分:0)
好的 - 谢谢大家的帮助。我终于弄明白了问题所在。有些人实际上提到了这一点,虽然我花了一些时间才弄明白。
我想多次向arrayList添加相同的数组;但是,我不知道即使在这种情况下我们需要为arrayList的每一行创建新的空间 - 假设我的arrayList是2-D。
所以在我的方法开始时,我添加了以下行:
allNeuronsParams.add(new double[getNumOfParams(defaulParamFilePath)+2]);
在此之前,我使用了一个数组,并且我多次添加一个数组,因此所有引用都指向同一个数组,并且只保存和打印上一次迭代中的值。