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

问题描述

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

abcd
efgh
ijkl

我需要创建String [ ][ ] resultMatrix = new String [3][4];来存储值,使得每一行是一行,一行中的每个char是该行的元素,但是我并不总是知道前面的矩阵的尺寸时间。

我的返回一个字符串,但是我需要一个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文件,并逐行处理

.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]]