问题描述
abcd
efgh
ijkl
我需要创建String [ ][ ] resultMatrix = new String [3][4];
来存储值,使得每一行是一行,一行中的每个char是该行的元素,但是我并不总是知道前面的矩阵的尺寸时间。
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
文件,并逐行处理
.map(s -> s.split(""))
通过调用.split("")
将字符串转换为String []-split在某些定界符处分割字符串,如果将空字符串作为定界符传递,则最终每个字符都被分离出来。现在,我们有了一个字符串数组流
.toArray(String[][]::new)
将流转换为数组。这需要告诉toArray
方法如何构造正确大小的新数组。 String[][]::new
是Java语言:在给定单个int参数(大小)的情况下调用new String[X][]
的概念。与之类似,String[][]::new
不会创建新的数组。它表示创建它们的概念(这是方法参考:它表示编写new String[X][]
的想法)。
如果您有一个字符串数组,则可以将其转换为2D字符数组,如下所示:
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]]