我在课堂上真的很挣扎。我们正在制作一个数据程序,它接收一个包含以下信息的文本文件:
. . . 9 . 2 6 . 4
6 . 4 3 . . . 7 .
. 7 . 1 . 4 . . .
. . 3 . 1 9 8 . .
1 5 . . 4 . . 9 7
. . 7 8 2 . 3 . .
. . . 2 . 6 . 5 .
. 3 . . . 7 1 . 2
9 . 2 5 . 1 . . .
并返回带有正确数独答案的文本文件。现在,我还没有开始执行此操作所需的回溯算法。我需要帮助的是从我向您展示的文本文件中获取信息并以这样的方式存储信息,以便我可以将这些回溯算法应用于从文本文件接收的数据。
我编写了代码来读取和显示(用于测试目的)文本文件,即此代码:
import java.io.BufferedReader;
import java.io.FileReader; import java.io.IOException;
公共类SudokuSolver {
int [][] sudoku;
SudokuSolver(){
sudoku = new int[9][9];
}
public void readinFile(){
//SudokuSolver su = new SudokuSolver();
System.out.println("Reading File from Java code");
//Name of the file
String fileName="C:\\puzzle1.txt";
try{
//Create object of FileReader
FileReader inputFile = new FileReader(fileName);
//Instantiate the BufferedReader Class
BufferedReader bufferReader = new BufferedReader(inputFile);
//Variable to hold the one line data
String line;
// Read file line by line and print on the console
while ((line = bufferReader.readLine()) != null) {
System.out.println(line);
}
//Close the buffer reader
bufferReader.close();
}catch(Exception e){
System.out.println("Error while reading file line by line:"
+ e.getMessage());
}
}
public static void main(String args[]) {
SudokuSolver s = new SudokuSolver();
s.readinFile();
}
但这一切都是读取文本文件。我的问题是:如何提取计算机解决数独问题所需的信息?我需要数字和'。' (因为'。'需要告诉计算机它是一个空的空间),而不是文本文件中的空格。我已经尝试在互联网上查找,但我很难理解,因为这部分(从文本文件中读取部分)根本没有在课堂上介绍。任何帮助,将不胜感激!!!谢谢!
答案 0 :(得分:0)
大量选择。我喜欢正则表达式,所以这个怎么样:
/** Describe a sudoku line. */
private static final Pattern SUDOKU_PATTERN = Pattern.compile("\s*([\.\d])\s*([\.\d])\s*([\.\d])\s*([\.\d])\s*([\.\d])\s*([\.\d])\s*([\.\d])\s*([\.\d])\s*([\.\d]).*");
private static final int CELL_COUNT = 0;
public List<Chararcter> parseLine(String line) {
Matcher m = SUDOKU_PATTERN.matcher(line);
List<Character> parsedLine = new ArrayList<Character>(9);
int index = 0;
while (i < CELL_COUNT) {
parsedLine.add(m.group(i++));
}
return parsedLine;
}
显然,需要进行大量的错误处理。我认为您还可以使用围绕\s*([\.\d])
的非捕获组,然后使用占有量词,以使模式更简单。返回的List<Character>
是输入行中有序的数字和点序列。进一步解析数字的代码是留给作业人员的练习。
答案 1 :(得分:0)
编写Java时,您的#1资源始终是Javadoc。查看Javadoc for String,您会发现许多操作/提取包含数据的方法。
您有很多选择。我会提供两个:
1)遍历String
并选出非空格字符。
您可以通过循环实现此目的:
for (char c : line.toCharArray())
{
// check each character, convert to `int`, put in your array
}
2)使用.split()
方法返回String[]
。
.split()
需要regular expression。通过提供一个名为“在一个或多个空格上拆分”的正则表达式,您将获得每个数字和。作为String
:
String[] elements = line.split("\\s+");
for (String s : elements)
{
// convert to `int`, put in your array
}
请注意,您还必须决定如何在.
中代表int[][]
。也许使用-1
。