重新分配2D数组的值

时间:2014-02-16 05:59:13

标签: java

编辑:感谢所有帮助我了解我必须做的事情以及问题所在的人。

SudokuStuff界面

public interface SudokuStuff
{
  int[][] sudokuGrid = new int[][] {{2,4,0,6,8,0,3,0,0}, 
            {0,0,0,0,0,0,9,0,0}, 
            {6,5,0,0,1,0,0,8,7},
            {0,0,0,0,0,7,0,9,8},
            {9,3,2,5,0,8,7,1,4},
            {7,1,0,4,0,0,0,0,0},
            {4,9,0,0,7,0,0,2,5},
            {0,0,5,0,0,0,0,0,0},
            {0,0,1,0,4,5,0,7,3}}; 
  void addNumber(int x, int y, int value);
  void removeNumber(int x, int y);
  void resetGrid();
  void drawGrid();
}

数独课程

public class Sudoku implements SudokuStuff{

    public void drawGrid(){
        System.out.println("   -----   -----   ----- ");
        for(int i = 0; i < 9; i++){
            if(i==3||i==6){
                System.out.println("   -----   -----   ----- ");
            }
            for(int j = 0; j < 9; j++){
                if(j==0||j==3||j==6){ 
                    System.out.print(" |");
                }
                if(sudokuGrid[i][j] != 0){
                    System.out.print(" "+sudokuGrid[i][j]);
                } else{
                    System.out.print("  ");
                }
                if(j==8){ 
                    System.out.print(" |");
                }
            }
            System.out.println();
        }
        System.out.println("   -----   -----   -----  ");
    }

    public void addNumber(int x, int y, int value){
        if(x>9||x<1||y>9||y<1||value>9||value<0){
            System.out.println("Bad Input");
        }else{
            sudokuGrid[x-1][y-1] = value;
        }
        drawGrid();
    }

    public void removeNumber(int x, int y){
        if(x>9||x<1||y>9||y<1){
            System.out.println("Bad Input");
        }else{
            sudokuGrid[x-1][y-1] = 0;
        }
        drawGrid();
    }
    public void resetGrid(){
        sudokuGrid = {{2,4,0,6,8,0,3,0,0}, 
            {0,0,0,0,0,0,9,0,0}, 
            {6,5,0,0,1,0,0,8,7},
            {0,0,0,0,0,7,0,9,8},
            {9,3,2,5,0,8,7,1,4},
            {7,1,0,4,0,0,0,0,0},
            {4,9,0,0,7,0,0,2,5},
            {0,0,5,0,0,0,0,0,0},
            {0,0,1,0,4,5,0,7,3}};
        drawGrid();
    }
}

所以为了回答我的问题,在SudokuStuff中我有一个2D预设值,在Sudoku中我有一个不起作用的resetGrid方法。如你所见,我希望它将网格重置为原始形式。这样做有什么建议吗?我现在拥有的是一个非法的表达错误开始。

如果您知道答案,请注意,是否有任何方法可以在交互窗格中从SudokuStuff运行Sudoku中的方法。这是我期中考试的一个练习题,我仍然对界面事物感到困惑。

任何帮助将不胜感激,如果我不立即回答它可能是因为我昏倒了,因为它已经很晚了。感谢。

4 个答案:

答案 0 :(得分:1)

您的重置功能不起作用的原因是您在resetGrid函数中声明了一个具有相同名称的新变量,而不是将您想要的值分配给类级别变量。拿走sudokuGrid上的类型,它应该可以工作。

答案 1 :(得分:0)

您需要new int[][]

sudokuGrid = new int[][] {...};

我不认为(?)它甚至可以编译。您只能在声明变量时使用= {...},而不能重新分配变量。

决赛:

public void resetGrid(){
    sudokuGrid = new int[][] {{2,4,0,6,8,0,3,0,0}, 
        {0,0,0,0,0,0,9,0,0}, 
        {6,5,0,0,1,0,0,8,7},
        {0,0,0,0,0,7,0,9,8},
        {9,3,2,5,0,8,7,1,4},
        {7,1,0,4,0,0,0,0,0},
        {4,9,0,0,7,0,0,2,5},
        {0,0,5,0,0,0,0,0,0},
        {0,0,1,0,4,5,0,7,3}};
}

在评论后修改

好的编辑完全脱离了我的头脑而没有真正想到它。有一个静态的最终数组“默认值”,并用它来重置你修改的数组:

static final int[][] defaultGrid = new int[][] {{2,4,0,6,8,0,3,0,0}, 
        {0,0,0,0,0,0,9,0,0}, 
        {6,5,0,0,1,0,0,8,7},
        {0,0,0,0,0,7,0,9,8},
        {9,3,2,5,0,8,7,1,4},
        {7,1,0,4,0,0,0,0,0},
        {4,9,0,0,7,0,0,2,5},
        {0,0,5,0,0,0,0,0,0},
        {0,0,1,0,4,5,0,7,3}};

...

// This will reset the grid to whatever is in defaultGrid
// assuming they have the same lengths
for (int i = 0; i = sudokuGrid.length; i++) {
   for (int y = 0; y = sudokuGrid[y].length; y++) {
      sudokuGrid[i][y] = defaultGrid[i][y];
   }
}

答案 2 :(得分:0)

您将要遇到的问题是在接口中声明的变量本质上是最终的。您可以做一些不同的事情,但最简单的方法是在数据库中创建一个变量,通过在运行时将sudokuGrid克隆到其中来填充,并且在重置时,只需通过再次重新调用sudokuGrid来重置它的值。

答案 3 :(得分:0)

在界面中声明的字段为static final (更不用说public),换句话说,它们是常量,这意味着您无法重新分配他们。

如果您希望能够执行类似

的操作
public void resetGrid(){
    sudokuGrid = new int[][]{
        {2,4,0,6,8,0,3,0,0}, 
        {0,0,0,0,0,0,9,0,0}, 
        {6,5,0,0,1,0,0,8,7},
        {0,0,0,0,0,7,0,9,8},
        {9,3,2,5,0,8,7,1,4},
        {7,1,0,4,0,0,0,0,0},
        {4,9,0,0,7,0,0,2,5},
        {0,0,5,0,0,0,0,0,0},
        {0,0,1,0,4,5,0,7,3}
    };
    drawGrid();
}

你应该在班上制作int[][] sudokuGrid字段。

编辑:

如果必须在接口中声明此数组,则可以尝试重新分配其行(它们不是最终的)。以下是如何执行此操作的示例:

public void resetGrid(){
    int[][] tmp = {
        {2,4,0,6,8,0,3,0,0}, 
        {0,0,0,0,0,0,9,0,0}, 
        {6,5,0,0,1,0,0,8,7},
        {0,0,0,0,0,7,0,9,8},
        {9,3,2,5,0,8,7,1,4},
        {7,1,0,4,0,0,0,0,0},
        {4,9,0,0,7,0,0,2,5},
        {0,0,5,0,0,0,0,0,0},
        {0,0,1,0,4,5,0,7,3}
    };
    for (int i=0; i<sudokuGrid.length; i++)
        sudokuGrid[i]=tmp[i];
    drawGrid();
}