【问题标题】:function change variable in javajava中的函数更改变量
【发布时间】:2020-01-17 19:44:00
【问题描述】:

我想检查变量(“矩阵”)在发送到特定函数(“moveAround”)时是否发生了变化, 所以我创建了另一个变量(“matrixB”),我给了它来自给定第一个变量的函数的值, 现在我比较这两个变量。

问题在于,由于某种原因,第一个变量和第二个变量都发生了变化。

代码如下所示:

matrixB = moveAround(matrix, userDir);
cmpMatrices(matrix, matrixB);

函数“moveAround”旨在返回一个不同的矩阵,然后给出(大部分时间)。 如果两个矩阵相似,则函数“cmpMatrices”返回 true,如果至少有一个分量不相等,则返回 false。

由于某种原因,当我在给它“matrix”后从“moveAround”函数中得到“matrixB”时,它同时改变了“matrix”和“matrixB”。

函数“moveAround”相对于“userDir”调用另一个函数名“moveUp”/“moveDown”/“moveRight”/“moveLeft”。

函数“moveUp”如下所示:

public static int[][] moveUp(int[][] matrix) {

    int i, j, m;

    for (j = 0; j < matrix.length; j++) {
        m = 1;
        for (i = 0; i + m < matrix.length;) {
            if (matrix[i + m][j] == 0) {
                m++;
            } else {
                if (matrix[i + m][j] == matrix[i][j]) {
                    matrix[i][j] = 2 * matrix[i][j];
                    matrix[i + m][j] = 0;
                    i++;
                } else {
                    if (matrix[i][j] == 0) {
                        matrix[i][j] = matrix[i + m][j];
                        matrix[i + m][j] = 0;
                        m++;
                    } else {
                        if (m != 1) {
                            matrix[i + 1][j] = matrix[i + m][j];
                            matrix[i + m][j] = 0;
                            i++;
                        } else {
                            i++;
                        }
                    }
                }
            }
        }
    }
    return matrix;
}

其他的向下/向右/向左移动非常相似,只是方向不同。

函数“cmpMatrices”如下所示:

public static boolean cmpMatrices(int[][] matrixA, int[][] matrixB){
    for(int i = 0; i < matrixA.length; i++){
        for(int j = 0; j < matrixA[i].length; j++){
            if(matrixA[i][j] != matrixB[i][j]){
                return false;
            }
        }
    }
    return true;
}

【问题讨论】:

  • 你能添加 moveAround 方法的定义吗?它可以帮助你理解你的问题。
  • 如果您按照matrixB = matrix 的方式进行操作,它们将指向同一个对象,因此如果您更改一个对象,那么您也会更改另一个对象。
  • 请显示完整代码
  • 只需创建一个布尔变量,例如changed,并在每次更新矩阵时将其设置为true...
  • 或者使用 javafx 属性...

标签: java


【解决方案1】:

moveAround 改变传递的矩阵并返回它。有点多余:要么返回 void,要么创建一个新的矩阵对象。

java 中的变量通常保存一个值,即矩阵对象。 分配给其他变量将共享该矩阵对象。

    int[][] a = new int[][]{{1, 2},{3, 4}};
    int[][] b = deepCopy(a);
    a[0][0] = 10;
    System.out.println(Arrays.deepToString(b));

static int[][] deepCopy(int[][] a) {
    int[][] clone = a.clone();
    for (int i = 0; i < a.length; ++i) {
        clone[i] = clone[i].clone();
    }
    return clone;
}

【讨论】:

    【解决方案2】:

    您需要在修改之前复制对象。

    这可能对你有帮助 How do I do a deep copy of a 2d array in Java?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      • 2013-04-02
      • 1970-01-01
      • 2020-10-16
      • 2019-01-24
      相关资源
      最近更新 更多