如何从文本文件读取一行中的每个字符到二维矩阵?

How to read each char in a line from a text file to a 2d matrix?

我有一个如下所示的文本文件:

abcd
efgh
ijkl

我需要创建 String[][] resultMatrix = new String[3][4]; 来存储值,这样每一行都是一行,一行中的每个字符都是该行的一个元素,但我并不总是知道矩阵的维度提前。

我有 returns 一个字符串,但我需要一个 3x4 矩阵:

public static String[][] readTxt(String filename) throws IOException {
    InputStream file = new FileInputStream(filename);
    BufferedReader buffer = new BufferedReader(new InputStreamReader(file));

    String line = buffer.readLine();
    StringBuilder sb = new StringBuilder();

    line = null;
    while ((line = buffer.readLine()) != null) {
        sb.append(line + "\n");
    }

    String fileString = sb.toString();
    fileString = fileString
            .replaceAll("\r", "")
            .replaceAll("\n>[A-Z]+", ">")
            .replaceAll("[0-9]+\n", "");

    String[] lines = fileString.split(">");
    String[][] resultMatrix = new String[lines.length][lines[0].length()];

    for (int i = 0; i < lines.length; i++) {
        resultMatrix[i] = lines[i].split("");
    }

    buffer.close();
    return resultMatrix;
}

你把它搞得异常复杂。

编辑:将 collect to list -> list to array 变为直接在流中调用 toArray

public static String[][] readTxt(String fn)  throws IOException {
    return Files.lines(Paths.get(fn))
        .map(s -> s.split(""))
        .toArray(String[][]::new);
}

一步一步:

Files.lines(Paths.get(fn))

读取整个 fn 文件,并对其进行处理 line-by-line

.map(s -> s.split(""))

通过调用 .split("") 将 String 转换为 String[] - split 在某个定界符上拆分字符串,如果将空字符串作为定界符传递,则最终会将每个字符分开。我们现在有一个字符串数组流

.toArray(String[][]::new)

将流转为数组。这需要告诉 toArray 方法如何构造一个大小合适的新数组。 String[][]::new 是 java-ese 的原因:给定单个 int 参数(大小)调用 new String[X][] 的概念。与此相同,String[][]::new 不会创建新数组。它代表了创建它们的概念(这是一个方法参考:它代表了写作的想法new String[X][])。

如果你有一个字符串数组,那么你可以将它转换为一个二维字符数组,如下所示:

String[] lines = {"abcd", "efgh", "ijkl"};

String[][] resultMatrix = Arrays.stream(lines)
        .map(str -> str.codePoints()
                .mapToObj(Character::toString)
                .toArray(String[]::new))
        .toArray(String[][]::new);

System.out.println(Arrays.deepToString(resultMatrix));
// [[a, b, c, d], [e, f, g, h], [i, j, k, l]]