矩阵存储。我们要去哪里?

时间:2018-10-28 17:41:42

标签: java

我们正在尝试读取一个文件,其中包含一个sudoko板,其中的整数和点表示空白。使用scannernew File读取文件没有问题,但是当我们无法以9 x 9矩阵打印印版时。

我们希望加载文件并将其存储在带有while循环的9 x 9矩阵中。但是这样做时会出现以下错误:

Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at Sodoku.main(Sodoku.java:19)

不确定,我们在做什么错。 到目前为止,我们有以下代码:

import java.util.*;
import java.lang.*;
import java.io.*;

public class Sodoku{
    public static void main(String[] args) 
        throws java.io.FileNotFoundException{
        Scanner input = new Scanner (new File("Sudoku.txt"));
        int m = 9;
        int n = 9;
        int[][] a = new int [m][n];
        while (input.next()!=null){
            for (int i=0;i<m;i++){
                for (int j=0;j<n;j++)
                    a[i][j]= input.nextInt();
            }   

        }
        //print the input matrix
        System.out.println("The input sorted matrix is : ");
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++)
                System.out.println(a[i][j]);
        }

    }

}

3 个答案:

答案 0 :(得分:0)

通过在移动指针的同时使用input.next(消耗其中一个值),可以使用

while (input.hasNext()==true){

这不会移动指针,只会验证它具有“下一个”值

答案 1 :(得分:0)

我能想到的最好的方法是将文件加载为字符串,然后将其解析为所需的格式。这里有代码。不漂亮,但是会成功的:

import java.util.*;
import java.lang.*;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Sudoku {

    static String readFile(String path, Charset encoding) 
    throws IOException 
    {
        byte[] encoded = Files.readAllBytes(Paths.get(path));
        return new String(encoded, encoding);
    }

    static int[][] parse(String path) throws IOException {
        String input = readFile(path, Charset.defaultCharset());
        int [][] array = new int[10][10];
        int x = 0;
        int y = 0;
        char[] chars = input.toCharArray();
        for (int i = 0; i < input.length(); i++) {
            if (chars[i] == '\n') {
                x = 0;
                y++;
                continue;
            } else if (chars[i] == '.') {
                array[y][x] = -1;
                x++;
                continue;
            }
            array[y][x] = Character.getNumericValue(chars[i]);
            x++;
        }

        return array;
    }
    public static void main(String[] args) 
        throws IOException {
        int m = 9;
        int n = 9;
        int[][] a = parse("Sudoku.txt");
        //print the input matrix
        System.out.println("The input sorted matrix is : ");
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++) {
                if (j==3 || j==6) System.out.print ("| ");
                if (a[i][j]==-1) {
                    System.out.print(". ");
                } else {
                    System.out.print(a[i][j]+" ");
                }
            }

            System.out.println("");
            if (i==2 || i==5) System.out.println("----------------------");
        }
    }
}

带有文件Sudoku.txt

.1.3..8..
5.96..7..
7.4.95.2.
4.....1..
.28.71.63
...2.495.
6.3..9..7
...43.516
.52.8..4.

输出以下内容:

. 1 . | 3 . . | 8 . . 
5 . 9 | 6 . . | 7 . . 
7 . 4 | . 9 5 | . 2 . 
----------------------
4 . . | . . . | 1 . . 
. 2 8 | . 7 1 | . 6 3 
. . . | 2 . 4 | 9 5 . 
----------------------
6 . 3 | . . 9 | . . 7 
. . . | 4 3 . | 5 1 6 
. 5 2 | . 8 . | . 4 . 

答案 2 :(得分:-2)

不确定,但是我认为使用input.next()作为while语句会导致稍后丢失此值(当您使用input.nextInt()时,它是文件中的下一个值,而不是语句中的下一个值)。尝试使用整数作为该值的临时容器:

int tmp;
while(tmp=input.next()!=null) and later on a[i][j]= tmp;

或者您可以尝试使用其他语句,例如while({{1)}