我正在创建一个类,它存储一个表示数独的9x9 int矩阵:
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..|
(&#39;。&#39;是数独的空格,由0值表示)
相反,我得到了这个可怕的东西:|..♣|.☻☺|..|
|. .|..|.♠.|
..|♥♣.|..♦|
|---+---+---|
|...|♥..|
|.☻.|. .|.☺.|
|..☺|☻♠.|..|
|---+---+---|
|♠..|..☻|.. |
|.♥.|.♦.|..|
|..♦|♣....|
我真的无法弄清楚我在哪里可以做错,将矩阵复制到另一个是我从未遇到过问题的事情,所以它与我所做的事情有关。 m在构造函数中?
提前感谢您提出任何建议。
修改:打印代码 这是我用来将数独转换为字符串的方法,然后打印出来:
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();
}
答案 0 :(得分:1)
当你将int转换为char(char)this.griglia [i] [j]时,它将它转换为一些奇怪的ascii字符。请尝试以下代码来简化您的解决方案。或者将其更改为else {sdk.append(&#34;&#34; + 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);
}
}
}
答案 1 :(得分:0)
尽量不要使用clone(),因为它需要被覆盖才能正常工作。而是尝试直接复制。
答案 2 :(得分:0)
尝试更换
StringBuilder sdk = new StringBuilder("");
用,
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-16LE"));