我目前正在尝试使用扫描仪为推箱子游戏创建求解器,我现在遇到的问题是我的扫描仪无法正常工作,通常我的文本文件看起来像这个:
## ###### #
##### #####
当我尝试使用代码时,我想扫描每个字符,包括空格,保存它们,创建2D数组,然后将它们放在其中,这是我的第一步。问题是我的扫描仪没有像我希望的那样担心,我使用以下行:
sc.useDelimiter("s*");
这是我尝试计算空格的问题,似乎确实如此,问题在于每次输入空格时都会切换行。我的代码现在看起来像:
package soko;
import java.util.*;
import java.io.*;
public class Dowork {
File file;
Scanner sc;
char a;
static int lines;
Scanner lineScanner;
static int maxChar;
ArrayList array;
char[][] array2;
Scanner bc;
int n;
int m;
static int lines2;
public Dowork() throws Exception{
//lines += 1;
file = new File("C:/Users/joaki/Desktop/sokoban/readin.txt");
sc = new Scanner(file);
bc = new Scanner(file);
sc.reset();
bc.reset();
sc.useDelimiter("s*");
ArrayList<Character> array = new ArrayList<Character>();
while(sc.hasNext()) {
String line = sc.next();
if(maxChar <= line.length()) {
maxChar = line.length();
}
for (char ch:line.toCharArray()) {
array.add(ch);
}
if(sc.hasNextLine()) {
lines++;
}
}
sc.close();
while(bc.hasNextLine()) {
lines2++;
}
bc.close();
array2 = new char[lines][maxChar];
Iterator<Character> itemIterator = array.iterator();
while(itemIterator.hasNext()) {
itemIterator.next();
for (int q = 0; q < lines; q++) {
for(int r = 0; r < maxChar; r++) {
Character j = itemIterator.next();
array2[q][r] = j;
}
}
}
for (int q = 0; q < lines; q++) {
for(int r = 0; r < maxChar; r++) {
System.out.println(array2[q][r]);
}
}
}
public static void main(String[] args) throws Exception{
Dowork g = new Dowork();
System.out.println(lines2);
}
}
举个例子,当我使用具有以下内容的txt文件时:
########
# # .#
# $$.#
#### #
#@ ##
####
它计算的行数为56,显然不应该是56。我在哪里做错了?
答案 0 :(得分:2)
要记住的主要编程规则之一:保持简单
请注意,为什么不简单使用普通的普通扫描程序(其分隔符未更改),并使用它来获取行,而仅从文件中获取行。然后,您可以根据需要处理这些行,例如转换为char数组,或者根据需要使用自己的行Scanner对其进行解析。
List<String> lines = new ArrayList<>();
while (sc.hasNextLine()) {
lines.add(sc.nextLine());
}
array2 = new char[lines.size()][];
for (int i = 0; i < array2.length; i++) {
array2[i] = lines.get(i).toCharArray();
}
例如:
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.List;
import java.util.Scanner;
public class DoWork2 {
// assuming data in data.txt file in same path as class files
private static final String RESRC_PATH = "data.txt";
private char[][] array2;
public DoWork2(String resrcPath) {
InputStream is = getClass().getResourceAsStream(resrcPath);
Scanner sc = new Scanner(is);
List<String> lines = new ArrayList<>();
while (sc.hasNextLine()) {
lines.add(sc.nextLine());
}
array2 = new char[lines.size()][];
for (int i = 0; i < array2.length; i++) {
array2[i] = lines.get(i).toCharArray();
}
if (sc != null) {
sc.close();
}
}
public String getLines2() {
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb);
for (char[] cs : array2) {
formatter.format("%s%n", new String(cs));
}
formatter.close();
return sb.toString();
}
public static void main(String[] args) {
DoWork2 doWork2 = new DoWork2(RESRC_PATH);
System.out.println(doWork2.getLines2());
}
}