在构造函数中复制矩阵时出现非常奇怪的行为
Very weird behaviour while copying matrix in constructor
我正在制作一个 class,它存储一个代表数独的 9x9 整数矩阵:
private final int sudoku[][];
我正在制作一个构造函数,它接受一个矩阵并将其复制到我之前声明的变量中:
public SudokuMatrix(int[][] sudoku)
{
this.sudoku= new int[9][];
if (sudoku.length != 9 || sudoku[0].length != 9)
{
throw new IllegalArgumentException("Wrong dimension!");
}
else
{
for (int i = 0; i < 9; i++)
{
this.sudoku[i] = sudoku[i].clone();
}
}
}
应该没什么大不了的,但是当我尝试将它与这样的矩阵一起使用时:
int[][] init = new int[][]{
{0, 0, 5, 0, 2, 1, 7, 0, 0},
{0, 9, 0, 0, 7, 0, 0, 6, 0},
{8, 0, 0, 3, 5, 0, 0, 0, 4},
{7, 0, 0, 1, 8, 0, 3, 0, 0},
{0, 2, 0, 0, 9, 0, 0, 1, 0},
{0, 0, 1, 2, 6, 0, 0, 0, 7},
{6, 0, 0, 0, 0, 2, 0, 0, 9},
{0, 3, 0, 0, 4, 0, 0, 7, 0},
{0, 0, 4, 5, 0, 0, 8, 0, 0},
};
SudokuMatrix s = new SudokuMatrix(init);
当我打印包含在 s 中的矩阵时,我用来打印它的函数(我确信它是正确的)应该打印如下内容:
|..5|.21|7..|
|.9.|.7.|.6.|
|8..|35.|..4|
|---+---+---|
|7..|18.|3..|
|.2.|.9.|.1.|
|..1|26.|..7|
|---+---+---|
|6..|..2|..9|
|.3.|.4.|.7.|
|..4|5..|8..|
('.'是数独中的空space,用0值表示)
相反,我得到了这个可怕的东西:
|..♣|.☻☺|..|
|. .|..|.♠.|
..|♥♣.|..♦|
|---+---+---|
|...|♥..|
|.☻.|. .|.☺.|
|..☺|☻♠.|..|
|---+---+---|
|♠..|..☻|.. |
|.♥.|.♦.|..|
|..♦|♣....|
我真的不知道我哪里做错了,将一个矩阵复制到另一个矩阵是我从来没有遇到过的问题,所以这与我在构造函数中有关吗?
提前感谢您的任何建议。
编辑:打印代码
这是我用来将数独变成字符串的方法,然后打印它:
public String toString()
{
StringBuilder sdk = new StringBuilder("");
for (int i = 0; i < 9; i++)
{
sdk.append("|");
for (int j = 0; j < 9; j++)
{
if (this.griglia[i][j] == 0)
{
sdk.append(".");
}
else sdk.append((char) this.griglia[i][j]);
if ((j+1)%3 == 0)
{
sdk.append("|");
}
}
if((i+1)%3 == 0)
{
sdk.append("\n");
sdk.append("|---+---+---|");
}
sdk.append("\n");
}
return sdk.toString();
}
当您将 int 转换为 char (char) this.griglia[i][j] 时,它会将其转换为一些奇怪的 ascii 字符。尝试以下代码来简化您的解决方案。或者改成 else{sdk.append( "" + this.griglia[i][j])}
也许我会尝试以下方法:
public class HelloWorld
{
public static void main(String[] args)
{
int[][] init = new int[][]{
{0, 0, 5, 0, 2, 1, 7, 0, 0},
{0, 9, 0, 0, 7, 0, 0, 6, 0},
{8, 0, 0, 3, 5, 0, 0, 0, 4},
{7, 0, 0, 1, 8, 0, 3, 0, 0},
{0, 2, 0, 0, 9, 0, 0, 1, 0},
{0, 0, 1, 2, 6, 0, 0, 0, 7},
{6, 0, 0, 0, 0, 2, 0, 0, 9},
{0, 3, 0, 0, 4, 0, 0, 7, 0},
{0, 0, 4, 5, 0, 0, 8, 0, 0},
};
SudokuMatrix s = new SudokuMatrix(init);
s.printMatrix();
}
}
public class SudokuMatrix
{
private final int sudoku[][];
public SudokuMatrix(int[][] sudoku){
this.sudoku= new int[9][9]; //note here I allocated a 9x9 matrix rather than copying each row in the matrix
if (sudoku.length != 9 || sudoku[0].length != 9)
{
throw new IllegalArgumentException("Wrong dimension!");
}
else
{
for (int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++){
this.sudoku[i][j] = sudoku[i][j];
}
}
}
}
public void printMatrix(){
for(int i = 0; i < 9; i++){
String inner = "";
for(int j = 0; j < 9; j++){
if(sudoku[i][j] == 0){
inner += ".";
}
else{inner += sudoku[i][j];}
}
System.out.println(inner);
}
}
}
尽量不要使用 clone(),因为它需要被覆盖才能正常工作。而是尝试直接复制。
尝试更换您的
StringBuilder sdk = new StringBuilder("");
与
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-16LE"));
我正在制作一个 class,它存储一个代表数独的 9x9 整数矩阵:
private final int sudoku[][];
我正在制作一个构造函数,它接受一个矩阵并将其复制到我之前声明的变量中:
public SudokuMatrix(int[][] sudoku)
{
this.sudoku= new int[9][];
if (sudoku.length != 9 || sudoku[0].length != 9)
{
throw new IllegalArgumentException("Wrong dimension!");
}
else
{
for (int i = 0; i < 9; i++)
{
this.sudoku[i] = sudoku[i].clone();
}
}
}
应该没什么大不了的,但是当我尝试将它与这样的矩阵一起使用时:
int[][] init = new int[][]{
{0, 0, 5, 0, 2, 1, 7, 0, 0},
{0, 9, 0, 0, 7, 0, 0, 6, 0},
{8, 0, 0, 3, 5, 0, 0, 0, 4},
{7, 0, 0, 1, 8, 0, 3, 0, 0},
{0, 2, 0, 0, 9, 0, 0, 1, 0},
{0, 0, 1, 2, 6, 0, 0, 0, 7},
{6, 0, 0, 0, 0, 2, 0, 0, 9},
{0, 3, 0, 0, 4, 0, 0, 7, 0},
{0, 0, 4, 5, 0, 0, 8, 0, 0},
};
SudokuMatrix s = new SudokuMatrix(init);
当我打印包含在 s 中的矩阵时,我用来打印它的函数(我确信它是正确的)应该打印如下内容:
|..5|.21|7..|
|.9.|.7.|.6.|
|8..|35.|..4|
|---+---+---|
|7..|18.|3..|
|.2.|.9.|.1.|
|..1|26.|..7|
|---+---+---|
|6..|..2|..9|
|.3.|.4.|.7.|
|..4|5..|8..|
('.'是数独中的空space,用0值表示)
相反,我得到了这个可怕的东西:
|..♣|.☻☺|..|
|. .|..|.♠.|
..|♥♣.|..♦|
|---+---+---|
|...|♥..|
|.☻.|. .|.☺.|
|..☺|☻♠.|..|
|---+---+---|
|♠..|..☻|.. |
|.♥.|.♦.|..|
|..♦|♣....|
我真的不知道我哪里做错了,将一个矩阵复制到另一个矩阵是我从来没有遇到过的问题,所以这与我在构造函数中有关吗?
提前感谢您的任何建议。
编辑:打印代码 这是我用来将数独变成字符串的方法,然后打印它:
public String toString()
{
StringBuilder sdk = new StringBuilder("");
for (int i = 0; i < 9; i++)
{
sdk.append("|");
for (int j = 0; j < 9; j++)
{
if (this.griglia[i][j] == 0)
{
sdk.append(".");
}
else sdk.append((char) this.griglia[i][j]);
if ((j+1)%3 == 0)
{
sdk.append("|");
}
}
if((i+1)%3 == 0)
{
sdk.append("\n");
sdk.append("|---+---+---|");
}
sdk.append("\n");
}
return sdk.toString();
}
当您将 int 转换为 char (char) this.griglia[i][j] 时,它会将其转换为一些奇怪的 ascii 字符。尝试以下代码来简化您的解决方案。或者改成 else{sdk.append( "" + this.griglia[i][j])}
也许我会尝试以下方法:
public class HelloWorld
{
public static void main(String[] args)
{
int[][] init = new int[][]{
{0, 0, 5, 0, 2, 1, 7, 0, 0},
{0, 9, 0, 0, 7, 0, 0, 6, 0},
{8, 0, 0, 3, 5, 0, 0, 0, 4},
{7, 0, 0, 1, 8, 0, 3, 0, 0},
{0, 2, 0, 0, 9, 0, 0, 1, 0},
{0, 0, 1, 2, 6, 0, 0, 0, 7},
{6, 0, 0, 0, 0, 2, 0, 0, 9},
{0, 3, 0, 0, 4, 0, 0, 7, 0},
{0, 0, 4, 5, 0, 0, 8, 0, 0},
};
SudokuMatrix s = new SudokuMatrix(init);
s.printMatrix();
}
}
public class SudokuMatrix
{
private final int sudoku[][];
public SudokuMatrix(int[][] sudoku){
this.sudoku= new int[9][9]; //note here I allocated a 9x9 matrix rather than copying each row in the matrix
if (sudoku.length != 9 || sudoku[0].length != 9)
{
throw new IllegalArgumentException("Wrong dimension!");
}
else
{
for (int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++){
this.sudoku[i][j] = sudoku[i][j];
}
}
}
}
public void printMatrix(){
for(int i = 0; i < 9; i++){
String inner = "";
for(int j = 0; j < 9; j++){
if(sudoku[i][j] == 0){
inner += ".";
}
else{inner += sudoku[i][j];}
}
System.out.println(inner);
}
}
}
尽量不要使用 clone(),因为它需要被覆盖才能正常工作。而是尝试直接复制。
尝试更换您的
StringBuilder sdk = new StringBuilder("");
与
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-16LE"));