在构造函数

时间:2015-11-09 03:03:08

标签: java matrix constructor deep-copy

我正在创建一个类,它存储一个表示数独的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();
}

3 个答案:

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