java - 使用流从 Java 8 中的文件中读取特定列,并将它们放入二维数组中

标签 java java-8 java-stream

我有一个看起来像这样的输入文件

@id1   1.2   3.4
@id2   6.8   8.1
@id3   1.5   9.4
@id4   5.9   2.7

我只想将数字存储在二维数组中,而忘记包含 @id 的第一列。 我还想只为该操作使用流。

到目前为止,我做了两种方法:

第一种方法读取输入文件并将每一行存储在一个列表中,作为一个字符串数组:

private List<String[]> savefromfile(String filePath) throws IOException {

        List<String[]> rowsOfFile = new LinkedList<String[]>();
        try (Stream<String> lines = Files.lines(Paths.get(filePath))) {
            lines.forEach(line -> {
                String rows[] = line.trim().split("\\s+");
                rowsOfFile.add(rows);
            });
            lines.close();
        }
        return rowsOfFile;

第二种方法将列表作为输入,并返回一个仅包含列号的二维数组:

private double[][] storeAllID(List<String[]> rowsOfFile) {
        int numberOfID = rowsOfFile.size();
        double[][] allID = new double[numberOfID][2];
        int i = 0;
        for (String[] line : rowsOfFile) {
            double id[] = new double[2];
            id[0] = Double.parseDouble(line[1]); 
            id[1] = Double.parseDouble(line[2]);
            allID[i++] = id;
        }
        return allID;
    }

有没有办法让这段代码更有效率?我只想要一个简短的方法来读取输入文件并返回一个仅包含数字的二维数组。 我认为没有必要编写 20 行代码来完成此操作。

最佳答案

savefromfile 中使用流并没有真正获得任何好处,因为您正在使用它,就像它是一个普通的 for 循环一样。为了使代码更简洁一些,您可以完全摆脱局部变量,并且不需要调用 close(),因为您已经在使用 try-with-resources。

private List<String[]> savefromfile(String filePath) throws IOException {
    try (Stream<String> lines = Files.lines(Paths.get(filePath))) {
        return lines
            .map(line -> line.trim().split("\\s+"))
            .collect(Collectors.toCollection(LinkedList::new));
    }
}

我不知道你为什么要将对 double[][] 的解析分离到一个单独的方法中,因为你可以在你的流中使用映射来完成它:

    private double[][] loadFromFile(String filePath) throws IOException {
        try (Stream<String> lines = Files.lines(Paths.get(filePath))) {
            return lines
                .map(line -> line.trim().split("\\s+"))
                .map(line -> new double[] {
                    Double.parseDouble(line[1]),
                    Double.parseDouble(line[2])
                })
                .toArray(double[][]::new);
        }
    }

对于性能,您只需要自己衡量使用较低级别的数据类型和循环是否值得增加复杂性。

关于java - 使用流从 Java 8 中的文件中读取特定列,并将它们放入二维数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56733274/

相关文章:

Java或Spring代码从nexus下载包

java - 在继承中重写方法

java - Hibernate序列化/反序列化对象并保存

java - 在 JSP 页面中使用 request.setAttribute

java - 如何使用 java 多线程解压巨大的文件夹 - 首选 java8?

java - 与 Map 的键相交的列表

Java CompletableFuture.anyOf(manyfutures).thenRun( runnable ) 只运行一次

java - Java编译器是否优化流过滤?

java - 如何使用流从 HashMap<E,R> 中提取 List<D>

java - elasticsearch:将 StreamOutput 转换为 String