为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

狐的传说 2023-02-16 17:16:29
我有一个看起来像这样的输入文件@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 行代码来做到这一点。
查看完整描述

1 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

使用 中的流并没有真正获得任何好处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);

        }

    }

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


查看完整回答
反对 回复 2023-02-16
  • 1 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号