我们正在尝试读取一个文件,其中包含一个sudoko板,其中的整数和点表示空白。使用scanner
和new 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]);
}
}
}
答案 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)}