扫描输入并跳过某些字符

时间:2012-02-19 04:19:58

标签: java arrays sudoku

我正在扫描一个带有几个分隔符的数独板的文本文件。这就是样本输入的样子。

1 - - | 4 5 6 | - - -  
5 7 - | 1 3 b | 6 2 4  
4 9 6 | 8 7 2 | 1 5 3  
======+=======+======  
9 - - | - - - | 4 6 -  
6 4 1 | 2 9 7 | 8 3 -  
3 8 7 | 5 6 4 | 2 9 -  
======+=======+======     
7 - - | - - - | 5 4 8   
8 r 4 | 9 1 5 | 3 7 2   
2 3 5 | 7 4 $ | 9 1 6  

它有“|”作为边界和===== + ==== + ====作为分隔符。我让这段代码忽略了|和==== + === + ===但它正在跳过代码的一部分并将它们声明为无效字符并在那里添加0

public static int [][] createBoard(Scanner input){

    int[][] nSudokuBoard = new int[9][9];

  for (rows = 0; rows < 9; rows++){

        for (columns = 0; columns < 9; columns++){

            if(input.hasNext()){

                if(input.hasNextInt()){
                    int number = input.nextInt();
                    nSudokuBoard[rows][columns] = number;
               }//end if int

                else if(input.hasNext("-")){
                    input.next();
                    nSudokuBoard[rows][columns] = 0;
                    System.out.print("Hyphen Found \n");
                    }//end if hyphen

                else if(input.hasNext("|")){
                    System.out.print("border found \n");
                    input.next();

                }// end if border
                else if(input.hasNext("======+=======+======")){
                    System.out.print("equal row found \n");
                    input.next();
                }// end if equal row

               else {
                   System.out.print("Invalid character detected at... \n Row: " + rows +" Column: " + columns +"\n");
                   System.out.print("Invalid character(s) replaced with a '0'. \n" );
                   input.next();
               }//end else

            }//end reading file
       }//end column for loop
    }//end row for looop
 return  nSudokuBoard;
}//end of createBoard

我和一位导师谈了这件事,但我不记得他关于如何解决这个问题的建议。

2 个答案:

答案 0 :(得分:1)

hasNext的String参数被视为正则表达式。你需要转义特殊字符:

else if(input.hasNext("\\|")){

else if(input.hasNext("======\\+=======\\+======")){

http://ideone.com/43j7R

答案 1 :(得分:0)

即使您正在使用边框或分隔线,您的循环也会增加行和列计数器。因此,即使您修复了其他问题(如上一个答案中所述),您也会在阅读完所有输入之前填写矩阵。只有在使用整数或短划线后,才需要修改代码以有条件地推进行和列计数器。这意味着删除for循环,将第一个if(input.hasNext())更改为while,并在您消费的地方添加rows++columns++整数或短划线并为nSudokuBoard[rows][columns]设置值。您还需要逻辑来确定何时增加rows以及何时将columns设置回0

另外,从风格上讲,您应该将rows重命名为row,将columns重命名为column