我刚刚编写了这个函数来将值添加到多维数组列表中,但不明白为什么所有添加的值都会覆盖到最近添加的值。我需要弄清楚为什么会发生这种情况。正如 javadoc 所说,它必须像这样“将指定的元素附加到此列表的末尾”。我在他的代码中没有看到任何地方可以覆盖以前的附加值。更奇怪的事情是数组的大小增加了
这是我的输出:
[0.4, 0.42, 0.4, 1.2200000000000002, 0.0010000000000000009] 添加 0 后
[0.4, 0.42, 0.4, 1.2200000000000002, 0.0010000000000000009] 加 1 后
[0.4, 0.42, 0.4, 1.2200000000000002, 0.0010000000000000009] 添加 2 后
[0.4, 0.42, 0.4, 1.2200000000000002, 0.0010000000000000009] 添加 3 后
[0.4, 0.42, 0.4, 1.2200000000000002, 0.0010000000000000009] 添加 4 后
[0.4, 0.42, 0.42, 1.24, 0.01200000000000001] 添加 0 后
[0.4, 0.42, 0.42, 1.24, 0.01200000000000001] 加 1 后
[0.4, 0.42, 0.42, 1.24, 0.01200000000000001] 加 2 后
[0.4, 0.42, 0.42, 1.24, 0.01200000000000001] 添加 3 后
[0.4, 0.42, 0.42, 1.24, 0.01200000000000001] 添加 4 后
[0.4, 0.42, 0.42, 1.24, 0.01200000000000001] 添加 5 后
[0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] 添加 0 后
[0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] 添加 1 后
[0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] 添加 2 后
[0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] 添加 3 后
[0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] 添加 4 后
[0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] 添加 5 后
[0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] 添加6后
这是我的功能:
public void createArrayList(ArrayList<Double> list,ArrayList<Double>
listLaid,int size,double sum, double absValue){
ArrayList<Double> workArray = new ArrayList<>();
ArrayList<ArrayList<Double>>
workMatrix= new ArrayList<>();
double abs=0;
for(int a = 0; a < size ;a++){
for(int b = 0; b < size ; b++){
for (int c = 0 ; c < size; c++){
abs =Math.abs(sum - list.get(a) - list.get(b) - list.get(c));
if( abs <= absValue){
double totalSum = listLaid.get(a) + listLaid.get(b) +
listLaid.get(c);
workArray.clear();
workArray.add(listLaid.get(a));
workArray.add(listLaid.get(b));
workArray.add(listLaid.get(c));
workArray.add(totalSum);
workArray.add(abs);
workMatrix.add(workArray);
}
}
}
}
}
for (int i = 0; i < workMatrix.size(); i++)
System.out.println(darbineMat.get(i)+" after add "+i);
最佳答案
您始终将列表的相同实例添加到列表中。这意味着最终 workMatrix
的所有行都是相同。
您必须为每个新行创建一个新的ArrayList
。更换
workArray.clear();
与
workArray = new ArrayList<Double>();
这里应该足够了。
<小时/>编辑:“引用”的概念乍一看可能会令人困惑(并且有些编程语言不以相同的方式存在此概念)。但是当您创建这样的列表实例时
ArrayList<Double> workArray = new ArrayList<Double>();
那么 workArray
只是您正在创建的实例的引用。您可以将其想象为一个“句柄”(事实上,它更像是 C/C++ 中的“指针”,但现在这可能会变得太困惑)。关键是当你写
ArrayList<ArrayList<Double>> workMatrix = new ArrayList<>();
ArrayList<Double> workArray = new ArrayList<>();
workMatrix.add(workArray);
然后您只需将引用添加到workMatrix
列表中。此引用仍然引用您创建的唯一实例:
// This prints "true": The first element of the matrix
// and the workArray are IDENTICAL. (Not only equal,
// but really IDENTICAL)
System.out.println(workMatrix.get(0) == workArray);
关于java 多维数组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23788496/