java 从文本文件创建迷宫时,是什么原因导致字符丢失和起始位置不正确?

bpzcxfmw  于 2023-05-21  发布在  Java
关注(0)|答案(3)|浏览(97)

我将一个文本文件转换成一个二维的字符数组,并获取特定字符的索引。
我有这个任务,我需要阅读Map,这是文本文件,并找到最短的路线了。到目前为止,我已经将文本文件转换为char数组,但是如果我在控制台上打印Map,就会丢失一些字符。不知为何,我找不到正确的起点位置。
我的想法是使用我在二元迷宫中发现的相同逻辑。如果你读了这篇文章,认为我在做一些非常愚蠢的事情,那么请让我知道。
首先,我创建了两个方法来获取map中的行数和列数:

private static int getRowsOfTheMap() throws IOException {
    int rows = 0;
    BufferedReader reader = getReader(filePath);
    while (reader.readLine() != null) rows++;
    reader.close();
    return rows;
}

private static int getColumnsOfTheMap() throws IOException {
    BufferedReader reader = getReader(filePath);
    String firstRow = reader.readLine();

    return firstRow.length();
}

然后,我创建了一个方法来获取2D char数组的map:

private static char[][] getMapFromFile() throws IOException {

    char[][] map = new char[getRowsOfTheMap()][getColumnsOfTheMap()];

    BufferedReader reader = getReader(filePath);

    for (int i = 0; i < map.length; i++) {
        for (int j = 0; j < map[0].length; j++) {
            map[i][j] = (char) reader.read();
        }
    }
    return map;
}

以及获取起点的方法:

private static int[] getStartingPoint(char[][] map) {
    int[] startingPoint = {
        -1,
        -1
    };
    for (int i = 0; i < map.length; i++) {
        for (int j = 0; j < map[i].length; j++) {
            if (map[i][j] == 'X') {
                startingPoint[0] = i;
                startingPoint[1] = j;
            }
        }
    }
    return startingPoint;
}

从文本文件Map和Map输出。

[1][2][3][4][5][6][7][8]

8fq7wneg

8fq7wneg1#

我能够生成正确的Map,并以[1, 2]为起点,代码如下:改编自你的
我创建了一个Maze类,使用map方法填充maprowscolumns字段。
此外,我创建了一个startingPoint方法来返回起始点行和列索引的int[]
最后,我创建了一个重写的toString方法来打印迷宫。
您可以使用Arrays.binarySearch查找X

class Maze {
    File file;
    char[][] map;
    int rows, columns;

    Maze(String path) throws IOException {
        file = new File(path);
        map();
    }

    void map() throws IOException {
        StringBuilder string = new StringBuilder();
        String line;
        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
            String newline = System.lineSeparator();
            rows = 0;
            while ((line = reader.readLine()) != null) {
                if (rows++ != 0) string.append(newline);
                string.append(line);
                columns = line.length();
            }
        }
        BufferedReader reader = new BufferedReader(new StringReader(string.toString()));
        map = new char[rows][columns];
        int index = 0;
        while ((line = reader.readLine()) != null)
            map[index++] = line.toCharArray();
    }

    int[] startPoint() {
        int index = 0;
        int column;
        for (char[] row : map) {
            if ((column = Arrays.binarySearch(row, 'X')) > 0)
                return new int[] { index, column };
            index++;
        }
        return null;
    }

    @Override
    public String toString() {
        StringBuilder string = new StringBuilder();
        String newline = System.lineSeparator();
        for (char[] row : map)
            string.append(row).append(newline);
        return string.toString();
    }
}
11111
1 X 1
1 1 1
1   1
111 1

[1, 2]
hgc7kmma

hgc7kmma2#

public static char[][] readMaze(Path file) throws IOException {
    return Files.lines(file).map(String::toCharArray).toArray(char[][]::new);
}

将读取您的迷宫,而不需要任何标题。只要把迷宫本身储存起来就行了。
您的问题源于阅读行分隔符。它们是存在的,因为没有被readLine调用使用

n9vozmp4

n9vozmp43#

您的问题似乎出在与阅读文件并将其存储在Map中相关的逻辑中。
您可以简单地读取文本文件并存储所有行。
然后,总行=行数
和总列=第一行的大小
这样,您就不必多次打开该文件。
关于阅读每一行存储在char数组=>
由于您的输入包含空格和换行符,因此最好使用reader.readline()而不是reader.read()
阅读更多关于read()和readLine()的内容:
BufferedReader read() not working
BufferedReader will not read final line of input
但是,您也可以使用更简单的逻辑,如下面的示例代码来读取文件并存储它:

private static char[][] getMapFromFile() throws IOException {

    List < String > allLines = Files.readAllLines(Paths.get(filePath));
    int totalRows = allLines.size();
    int totalColumns = allLines.get(0).length();

    char[][] map = new char[totalRows][totalColumns];

    for (int i = 0; i < totalRows; i++) {
        String currentLine = allLines.get(i);
        for (int j = 0; j < totalColumns; j++) {
            map[i][j] = currentLine.charAt(j);
        }
    }
    return map;
}

相关问题