扫描仪未按预期计算空白区域



我目前正在尝试使用扫描仪为 Sokoban-game 创建求解器,我现在遇到的问题是我的扫描仪无法按预期工作,我通常有一个文本文件看起来接近这样:

## ###### #
##### #####

当我尝试使用我的代码时,我想扫描每个字符,包括空格,保存它们,创建一个 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。我哪里做错了?

要记住的主要编程规则之一:保持简单

关于这一点,为什么不简单地使用一个普通的普通扫描仪,一个分隔符没有被更改的扫描仪,并使用它来获取文件中的行和仅行。然后,您可以根据需要处理这些行,例如转换为char数组,或者在需要时使用自己的行扫描仪对其进行解析。

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());
}
}

最新更新