在构造函数中复制矩阵时出现非常奇怪的行为

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