变量(矩阵)更改其值-Java

变量(矩阵)更改其值-Java,java,matrix,multidimensional-array,Java,Matrix,Multidimensional Array,我的代码有问题。我有一个包含整数矩阵的对象,我使用这个矩阵作为原始模型来创建其他矩阵。但最后,我的原始矩阵有一个不同的值,但我不会以任何方式改变 public Matrix generateAdjacencyMatrix(Matrix m) { int storedValue; int fitness; int[][] auxiliar_matrix = mc.matrixStructure.matrix; int[] original_ordering = mc.matrixS

我的代码有问题。我有一个包含整数矩阵的对象,我使用这个矩阵作为原始模型来创建其他矩阵。但最后,我的原始矩阵有一个不同的值,但我不会以任何方式改变

public Matrix generateAdjacencyMatrix(Matrix m)
{
  int storedValue;
  int fitness;
  int[][] auxiliar_matrix = mc.matrixStructure.matrix;
  int[] original_ordering = mc.matrixStructure.matrixOrder;
  for(int i=0;i<mc.matrixStructure.getMatrixSize();i++)
  {
      if(m.matrixOrder[i] != original_ordering[i]) //Only changes if the columns have changed
      {
          for(int j=0;j<mc.matrixStructure.getMatrixSize();j++)
          {
              storedValue = auxiliar_matrix[j][m.matrixOrder[i]];
              auxiliar_matrix[j][m.matrixOrder[i]] = auxiliar_matrix[j][original_ordering[i]];
              auxiliar_matrix[j][original_ordering[i]] = storedValue;
          }
          for(int j=0;j<mc.matrixStructure.getMatrixSize();j++)
          {
              storedValue = auxiliar_matrix[m.matrixOrder[i]][j];
              auxiliar_matrix[m.matrixOrder[i]][j] = auxiliar_matrix[original_ordering[i]][j];
              auxiliar_matrix[original_ordering[i]][j] = storedValue;
          }
      }
  }
  m.matrix = auxiliar_matrix;
  m.setFitness(computeFitness(m.matrix));
  return m;
}
这是创建其他矩阵的方法。对象mc包含我的原始矩阵mc.matrixStructure.matrix,在for循环之后,值就不同了

我正在构造函数方法上实例化此对象:

 public GeneticAlgorithm() throws IOException
{
    this.r = new Random();
    this.matingPool = new ArrayList<>(populationSize);
    this.population = new ArrayList<>(populationSize);
    this.nextGeneration = new ArrayList<>(populationSize);
    this.mc = new MatrixCreator("CS4006_input_file2.txt");
    this.mc.check0or1();
    this.mc.checkDiagonalLine();
    this.mc.checkSymmetry();
    this.auxiliarVector =  mc.matrixStructure.matrixOrder;
    this.auxiliarMatrix = new Matrix(mc.matrixStructure.getMatrixSize());
    this.matrixSize = mc.matrixStructure.getMatrixSize();
}
就是这样。

当你这样做的时候

int[][] auxiliar_matrix = mc.matrixStructure.matrix;
int[] original_ordering = mc.matrixStructure.matrixOrder;
。。。您正在对mc.matrixStructure.matrix和mc.matrixStructure.matrixOrder引用的相同对象进行辅助矩阵和原始排序引用。通过一组引用修改这些对象等同于通过另一组引用修改它们,因此与您的断言相反,您完全是在更改原始矩阵。为了避免这种情况,您需要复制阵列

此外,辅助矩阵有两个问题,因为Java2D数组是数组的数组,数组也是对象。您需要执行该二维阵列的深度复制,以避免修改原始对象

像这样的东西应该可以做到:

int[] original_ordering = Arrays.copyOf(mc.matrixStructure.matrixOrder);
int[][] auxiliar_matrix = Arrays.copyOf(mc.matrixStructure.matrix);
int i;

for (i = 0; i < auxiliar_matrix.length; i += 1) {
    auxiliar_matrix[i] = Arrays.copyOf(auxiliar_matrix[i]);
}

将对象指定给引用变量时,即指定其引用。您不能将其复制到该引用

因此,在诸如

int[][] auxiliar_matrix = mc.matrixStructure.matrix;
您的辅助矩阵引用变量现在引用mc.matrixStructure.matrix引用的矩阵

它是同一个矩阵,位于堆上

现在您正在更改辅助矩阵所指对象内的数据。例如,这里:

auxiliar_matrix[j][original_ordering[i]] = storedValue;
这意味着它和mc.matrixStructure.matrix所引用的矩阵中的值都将发生更改


如果要处理原始矩阵的单独副本而不影响它,必须先将其复制到新对象,然后将此副本指定给辅助矩阵。在本例中,它是一个数组数组,因此您必须创建一个相同长度的新数组,并使用arrays.copyOf复制每个子数组。当心尝试在数组数组中使用ARARY.COMPOFE,拷贝浅,只复制对子数组的引用,这会给你相同的问题。

@ ICCTHEMANTHONE,这是java,不是C++。堆栈上没有分配对象,尽管对象引用可能存在于堆栈中。不过,出于其他原因,他确实需要做一些复制。非常感谢!我对Java中的引用仍然有一些问题,我一定会读一些这方面的文章…你的答案非常完美!我知道我做错了什么。谢谢你的回答!如果我有足够的声誉,我会投票……但你也帮了我很多忙!