[英]Arraylist of Integer[][] (matrix) in java
我在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調用一次求解方法。
實際上,您總是修改相同的矩陣實例。
每次更改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("--------");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.