簡體   English   中英

Java中Integer [] [](矩陣)的數組列表

[英]Arraylist of Integer[][] (matrix) in java

我在Java中定義了矩陣的ArrayListInteger[][] )。 當我將新矩陣添加到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調用一次求解方法。

實際上,您總是修改相同的矩陣實例。

每次更改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;
}

當您這樣做時:

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("--------");
    }
}

在列表中添加元素會添加對該元素的引用。 如果隨后更改了該元素,則更改后的元素將顯示在列表中。

從您的代碼示例不能確認這是問題所在,因為您尚未發布right()方法的代碼。 我的懷疑是,它每次都返回相同的,經過更改的矩陣,而不是返回具有不同值的新矩陣。

這個問題說明了如何克隆二維數組 ,您需要這樣做以避免重復將同一數組添加到列表中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM