我在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调用一次求解方法。
答案 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 您需要做的是避免重复添加相同的列表。