gpt4 book ai didi

Java 3d ArrayList 子矩阵修改改变了 3d ArrayList 的其他子矩阵

转载 作者:行者123 更新时间:2023-11-30 11:30:13 24 4
gpt4 key购买 nike

我是 Java 的新手,遇到了一个问题。我有一个 3d ArrayList然后我发送了一个 ArrayList 的项目到修改它的方法。但这似乎改变了 3d 的其他项目 ArrayList .

所以我创建了一个矩阵 ArrayList<ArrayList<ArrayList<Integer>>>并打印出每一项。

for(int i =0; i<solutionsMatrix.size(); i++)
{
//System.out.println(i);
System.out.println(solutionsMatrix.get(i));
}

然后我发送这个 3d ArrayList到另一种方法。其中修改了每个子矩阵 (i)。但是当以某种方式这样做时,矩阵 (i) 的修改也会改变其他(非 i)矩阵。

private ArrayList<ArrayList<ArrayList<Integer>>> siftSolutions(ArrayList<ArrayList<ArrayList<Integer>>> solutionsMatrix)
{
for(int n=0; n<solutionsMatrix.size();n++){
//System.out.println(solutionsMatrix.get(n));
ArrayList<ArrayList<Integer>> currentMatrix = mirrorMatrix(solutionsMatrix.get(n));
System.out.println(currentMatrix);
}

问题是打印出的矩阵(第二个代码块中注释掉的部分)与第一个代码块的打印出矩阵不匹配。我摆弄了代码并确定方法 mirrorMatrix以某种方式改变了 3d 矩阵 solutionsMatrix .

public ArrayList<ArrayList<Integer>> mirrorMatrix(ArrayList<ArrayList<Integer>> unmirrored) {
//every value of ij needs to equal ji, thus simply transmit all non-zeros
ArrayList<ArrayList<Integer>> mirror = new ArrayList<ArrayList<Integer>>(unmirrored);
for (int i = 0; i < mirror.size(); i++) {
for (int j = 0; j < mirror.size(); j++) {
if (mirror.get(i).get(j) != 0) {
mirror.get(j).set(i, mirror.get(i).get(j));
}
}
}
return mirror;
}

我曾尝试在线搜索答案,但找不到解释(这可能只是因为我不知道正确的术语来很好地描述我的问题)。我希望有人能向我解释为什么会发生这种情况,以便我可以解决该问题并在将来避免它。

最佳答案

ArrayList<ArrayList<Integer>> mirror = new ArrayList<ArrayList<Integer>>(unmirrored);

这一行并没有对其中的所有元素进行深拷贝。它确实创建了 ArrayList 的新实例, 但它的所有元素都是 ArrayList<Integer> 的相同实例正如存在于 unmirrored 中实例。

所以用 mirror.get(j).set(i, mirror.get(i).get(j)); 改变这些元素确实改变了同一个实例 mirror.get(j)unmirrored.get(j) .即 mirror.get(j) == unmirrored.get(j) .

关于Java 3d ArrayList 子矩阵修改改变了 3d ArrayList 的其他子矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17910490/

24 4 0