java中的Integer [] [](矩阵)的Arraylist

时间:2015-03-27 16:05:04

标签: java matrix arraylist

我在Java中定义了ArrayList矩阵(Integer[][])。当我在ArrayList中添加一个新矩阵时,它会将所有变量更改为最后一个矩阵。

我的意思是当我添加

0 4 4 2
0 4 4 2
1 2 3 4
4 5 9 7

然后添加

1 4 7 8
0 1 2 3
4 5 6 7
4 1 2 3

当我打印这样的元素时:

1 4 7 8
0 1 2 3
4 5 6 7
4 1 2 3
-------
1 4 7 8
0 1 2 3
4 5 6 7
4 1 2 3

那我该怎么做呢? 这是我的代码:

private Integer matrix[][] = new Integer[4][4];

public Integer[][] right(Integer[][] M) {
        for (int k = 0; k < 4; k++)
            for (int i = 0; i < 4; i++)
                for (int j = 0; j < 3; j++) {
                    if (M[i][j] != 0 && M[i][j + 1] == 0) {
                        M[i][j + 1] += M[i][j];
                        M[i][j] = 0;
                        new_tile = true;
                    }
                }
        for (int i = 0; i < 4; i++)
            for (int j = 3; j > 0; j--) {
                if (M[i][j] == M[i][j - 1] && M[i][j] != 0 && M[i][j - 1] != 0) {
                    M[i][j] += M[i][j - 1];
                    M[i][j - 1] = 0;
                    new_tile = true;
                }
            }
        for (int k = 0; k < 4; k++)
            for (int i = 0; i < 4; i++)
                for (int j = 0; j < 3; j++) {
                    if (M[i][j] != 0 && M[i][j + 1] == 0) {
                        M[i][j + 1] += M[i][j];
                        M[i][j] = 0;
                        new_tile = true;
                    }
                }
        return M;
    }


static void printMatrix(Integer[][] matrix) {
    for (int i = 0; i < matrix.length; i++) {
        for (int j = 0; j < matrix[0].length; j++) {
            System.out.print(matrix[i][j]);
        }
        System.out.println();
    }
}

/**
 * Print the elements in a matrix list
 */
static void printMatrices(ArrayList<Integer[][]> matrices) {
    for (Integer[][] matrix : matrices) {
        printMatrix(matrix);
        System.out.println("--------");
    }
}
public void solve() {

    Integer[][] temp = right(matrix);
    printMatrix(temp);
    if (new_tile)
        visited_nodes.add(temp);
    else {
        printMatrices(visited_nodes);
    }
    refresh();
}

    @Override
    public void actionPerformed(ActionEvent e) {

        solve();
        repaint();
    }

并且每隔100ms调用一次求解方法。

3 个答案:

答案 0 :(得分:1)

您实际上总是修改矩阵的相同实例。

更改它的right()方法,以便在每次调用时创建一个新矩阵:

public Integer[][] right(Integer[][] M) {
    Integer[][] newM = new Integer[4][4];

    // modify newM in your algo instead of M
    // Showing only the first bloc
    for (int k = 0; k < 4; k++)
        for (int i = 0; i < 4; i++)
            for (int j = 0; j < 3; j++) {
                if (M[i][j] != 0 && M[i][j + 1] == 0) {
                    newM[i][j + 1] = M[i][j + 1] + M[i][j];
                    newM[i][j] = 0;
                    new_tile = true;
                }
            }
    //...
    return newM;
}

答案 1 :(得分:0)

当你这样做时:

private Integer matrix[][] = new Integer[4][4];

您创建一个对象并使变量matrix指向它。当您致电right(matrix)时,您将原始对象传递给right()方法,因此它会被更改。相反,您应该传递当前矩阵的副本或创建一个新矩阵,具体取决于您的需要。

将代码分解为更小的方法可以更容易推理。像这样:

/**
 * Print a single matrix
 */
static void printMatrix(Integer[][] matrix) {
    for (int i = 0; i < matrix.length; i++) {
        for (int j = 0; j < matrix[0].length; j++) {
            System.out.print(matrix[i][j]);
        }
        System.out.println();
    }
}

/**
 * Print the elements in a matrix list
 */
static void printMatrices(List<Integer[][]> matrices) {
    for (Integer[][] matrix : matrices) {
        printMatrix(matrix);
        System.out.println("--------");
    }
}

答案 2 :(得分:0)

向列表添加元素会添加对该元素的引用。如果随后更改了元素,则会在列表中看到更改的元素。

无法从代码示例中确认这是问题所在,因为您尚未发布right()方法的代码。我怀疑它每次都返回相同的,改变的矩阵,而不是具有不同值的新矩阵。

此问题说明如何clone a 2D array 您需要做的是避免重复添加相同的列表。