如何从文本文件读取一行中的每个字符到二维矩阵?
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]]
我有一个如下所示的文本文件:
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]]