亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用流從 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 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號