我坚持以下问题。忽略最多的代码,我的问题是:我每次迭代都有一个不同的列表x,我想在2DarrayList conVert中解析它,所以我使用conVert.add(x);但我的问题是在x.clear();.当我在清除conVert之前打印conVert但是当我在清除除了x之后打印它并且conVert被清除时。我能为此做些什么?提前致谢
List<Integer> x = new ArrayList<Integer>();
// List<Integer> x1 = new ArrayList<Integer>();
List<Integer> valenceList = new ArrayList<Integer>();
List<List<Integer>> conVert = new ArrayList<List<Integer>>();
for (int q = 1; q <= 4; q++) {
for (int i = 0; i < Faces.length; i++) {
for (int j = 0; j < 2; j++) {
if (Faces[i][j] == q) {
x.add(Faces[i][0]);
x.add(Faces[i][1]);
x.add(Faces[i][2]);
}
}
}
removeDuplicateWithOrder((ArrayList) x);
valenceList.add(x.size() -1);
//x1 = x;
conVert.add(x);
System.out.println(conVert);
x.clear();
//System.out.println(conVert);
}
答案 0 :(得分:1)
您向x
添加conVert
将会对x
进行任何更改,因为它只是在列表中添加了引用。你可以这样复制它:
conVert.add(new ArrayList<Integer>(x));
或者你可以在第一个for循环中移动x
的构造并跳过清除。
答案 1 :(得分:0)
如果我理解正确,你会看到conVert的内容和x一样被清除。这是因为list.add不是深层副本,它只将引用放在原始文件中。你可以做的是克隆x并添加 -
List<Integer> tempX = new List<Integer>();
tempX.addAll(x);
conVert.add(tempX);
x.clear();
这应该有效。