我需要通过2D数组中位置[0] [0]的字符串值标记迷宫的开头。问题是,每次读取新行时,位置[i] [0]的值都会改变,我需要它始终是位置[0] [0]的第一个值。没有空格或分隔符,所以我正在读取每行中每行的每个char值。
我无法弄清楚如何才能看到迷宫[0] [0]中的字符串是我想要设置为1的字符串?
布置迷宫,使第一行有2个整数;第1个int =迷宫中的行数,第2个int =迷宫中的列数。起始始终为[0] [0],结尾始终为[row-1] [col-1]。剩下的行是迷宫。因此,文本文件中的第2行=迷宫的第0行。
所以我将该文件读作String值,然后将第一行String值解析为int,并使用这些值来定义我的2D整数数组。
然后我读完剩余的行并将它们与第一个char值进行比较,该值始终等于组成路径的值(如果存在)。如果读取的符号是=到路径然后它存储为1,否则它存储为0.然后我将通过2D数组并开始比较不同的坐标以确定路径并存储该信息一个队列然后一个堆栈。
我遇到的问题是它适用于前3行,但值1& 0为其余行翻转。我附上了代码片段,它正在读取的.txt文件。我知道这是因为它将自己与每行的第一个元素进行比较,对于前3行,它是一个“。”。然后是剩下的行的“+”。
import java.io.*;
import java.util.*;
public class MazeArray {
String info;
String[] rowCol;
//private char [][] maze;
private int [][] maze;
private Scanner readFile;
private int path, cur, row, col;
public MazeArray()
{
maze = new int[0][0];
}
public int[][] readFile(String fileName) throws IOException
{
readFile = new Scanner(new File(fileName));
info = readFile.nextLine();
rowCol = info.split(" ",2);
row = Integer.parseInt(rowCol[0]);
col = Integer.parseInt(rowCol[1]);
maze = new int[row][col];
System.out.println("# of rows: " + row + " # of col: " + col);
while (readFile.hasNextLine())
{
//System.out.println(readFile.next());
for (int i=0; i<row; i++)
{
String symbol = readFile.nextLine();
for (int j=0; j<col; j++)
{
path = symbol.charAt(0);
//safe = symbol.charAt(maze[0][0]);
maze[i][j] = symbol.charAt(j);
if (maze[i][j] == path)
{
maze[i][j] = 1;
}
else
{
maze[i][j] = 0;
}
System.out.println("for loop Path coord = (" + i + " , " + j + ") Value at coord = " + maze[i][j]);
}//for j
}//for i
}// while
readFile.close();
return maze;
}
txt.File(Maze)的内容
7 12
..+.+.++++++
.++...++...+
..++.....+.+
+.+..++.+..+
+...++....++
+.+++..++..+
++++++++++..
输出 - 右
for loop Path coord = (0 , 0) Value at coord = 1
for loop Path coord = (0 , 1) Value at coord = 1
for loop Path coord = (0 , 2) Value at coord = 0
for loop Path coord = (0 , 3) Value at coord = 1
for loop Path coord = (0 , 4) Value at coord = 0
for loop Path coord = (0 , 5) Value at coord = 1
for loop Path coord = (0 , 6) Value at coord = 0
for loop Path coord = (0 , 7) Value at coord = 0
for loop Path coord = (0 , 8) Value at coord = 0
for loop Path coord = (0 , 9) Value at coord = 0
for loop Path coord = (0 , 10) Value at coord = 0
for loop Path coord = (0 , 11) Value at coord = 0
for loop Path coord = (1 , 0) Value at coord = 1
for loop Path coord = (1 , 1) Value at coord = 0
for loop Path coord = (1 , 2) Value at coord = 0
for loop Path coord = (1 , 3) Value at coord = 1
for loop Path coord = (1 , 4) Value at coord = 1
for loop Path coord = (1 , 5) Value at coord = 1
for loop Path coord = (1 , 6) Value at coord = 0
for loop Path coord = (1 , 7) Value at coord = 0
for loop Path coord = (1 , 8) Value at coord = 1
for loop Path coord = (1 , 9) Value at coord = 1
for loop Path coord = (1 , 10) Value at coord = 1
for loop Path coord = (1 , 11) Value at coord = 0
for loop Path coord = (2 , 0) Value at coord = 1
for loop Path coord = (2 , 1) Value at coord = 1
for loop Path coord = (2 , 2) Value at coord = 0
for loop Path coord = (2 , 3) Value at coord = 0
for loop Path coord = (2 , 4) Value at coord = 1
for loop Path coord = (2 , 5) Value at coord = 1
for loop Path coord = (2 , 6) Value at coord = 1
for loop Path coord = (2 , 7) Value at coord = 1
for loop Path coord = (2 , 8) Value at coord = 1
for loop Path coord = (2 , 9) Value at coord = 0
for loop Path coord = (2 , 10) Value at coord = 1
for loop Path coord = (2 , 11) Value at coord = 0
输出 - 错误
for loop Path coord = (3 , 0) Value at coord = 1 //Value should = 0 because ="+"
for loop Path coord = (3 , 1) Value at coord = 0
答案 0 :(得分:1)
您的错误位于内部for
循环中:
path = symbol.charAt(0); // <-- this is erroneous
maze[i][j] = symbol.charAt(j);
if (maze[i][j] == path) {
maze[i][j] = 1;
} else {
maze[i][j] = 0;
}
您要更改每一行的path
字段。因此,对于前三行,您要设置.
的路径,因为这是该行中的第一个字符。在第四行,第一个字符为+
,因此结果显示为翻转。
您需要决定如何确定路径字符,并且每个文件只执行一次。如果您确信整个迷宫中的第一个字符是路径符号,那么请阅读一次并存储它:
public int[][] readFile(String fileName) throws IOException {
readFile = new Scanner(new File(fileName));
info = readFile.nextLine();
rowCol = info.split(" ", 2);
row = Integer.parseInt(rowCol[0]);
col = Integer.parseInt(rowCol[1]);
maze = new int[row][col];
System.out.println("# of rows: " + row + " # of col: " + col);
int row = 0;
while (readFile.hasNextLine()) {
String symbol = readFile.nextLine();
if (row == 0) {
path = symbol.charAt(0);
}
for (int j = 0; j < col; j++) {
maze[row][j] = symbol.charAt(j);
if (maze[row][j] == path) {
maze[row][j] = 1;
} else {
maze[row][j] = 0;
}
System.out.println("Path coord = (" + row + " , " + j
+ ") Value at coord = " + maze[row][j]);
}// for j
row++;
}// while
readFile.close();
return maze;
}
我还纠正了你的循环结构。在您的原始示例中,您的while
循环无效且仅循环一次。你的for
循环正在完成所有工作(没有检查是否有要阅读的行)。
其他观察:
目前,您的课程可以简化为使用单一静态方法的实用工具类(虽然我知道这可能会在将来发生变化)。
您的班级中存储了临时变量(例如row
,col
和readFile
);它们应该是你方法中的变量。
您似乎将二进制值(1
和0
)存储在数组中,但是作为整数存储。您可以考虑返回一个布尔数组。