【问题标题】:Arraylist of Integer[][] (matrix) in javajava中Integer[][](矩阵)的Arraylist
【发布时间】:2015-03-27 16:05:03
【问题描述】:

我在 Java 中定义了矩阵 (Integer[][]) 的 ArrayList。当我在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();
    }

以及每 100 毫秒调用一次的求解方法。

【问题讨论】:

  • 你能显示更多代码吗?只是一个猜测,但我敢打赌,您不会添加新的数组/矩阵 - 而是添加 temp,更改其值,然后再次添加相同的实例
  • 感谢您的关注。但是每次将 temp 添加到 arraylist 时,我都会更改 temp 的变量。
  • 如何迭代 k?上面的双循环将打印矩阵,但您需要循环 k 的值以获取 ArrayList 中的每个矩阵。
  • 就像我上面说的,你能展示更多的代码(最好是一个 MCVE)吗?从当前代码中可以看出如何添加数组/矩阵,以及如何完全打印出内容(您的代码如何在 k 上循环?)。
  • 另外,显示实际输出,包括 k + "-----" 语句。

标签: java matrix arraylist


【解决方案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;
}

【讨论】:

    【解决方案2】:

    将元素添加到列表会添加对该元素的引用。如果该元素随后被更改,则更改的元素将显示在列表中。

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

    这个问题展示了如何clone a 2D array 您需要这样做以避免重复将同一个添加到您的列表中。

    【讨论】:

    • 如果问题是你上面解释的,我该如何解决?
    【解决方案3】:

    当你这样做时:

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

    【讨论】:

    • 感谢您的关注 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    相关资源
    最近更新 更多