ストリームを使用してJava 8でのファイルから特定の列を読み、2次元配列に入れ

ワッシムAlsafwi:

私はこのようになりますことを、入力ファイルを持っています

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

私は2次元配列に数値を格納し、@idが含まれている第一の列を忘れるしたいと思います。私はまた、処理のためだけにストリームを使用します。

これまでのところ私は2つの方法を作りました。

第一の方法は、入力ファイルを読み取り、文字列の配列として、リスト内の各ラインを格納します。

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;

入力リストとして第2の方法取り、列だけ番号が含まれている2次元配列を返します。

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;
    }

このコードは、より効率的にする方法はありますか?私は、入力ファイルを読み込み、数字だけを含む2次元配列を返すだけ、短い方法をしたいです。私はそれがこれを行うには、コードの20行を記述する必要はないと思います。

vlumi:

あなたは本当ににおけるストリームの使用上の任意の利益を獲得していないsavefromfileあなたはそれがforループ無地だったまさに同じようにそれを使用しているので、。コードビットクリーナーを作るために、あなたは完全にローカル変数を取り除くことができ、また、への呼び出しはclose()すでに試し-と、リソースを使用しているとして不要です。

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));
    }
}

あなたがマップであなたのストリーム内のそれを行う可能性があるので、別の方法に[] []を倍増するために解析を分離する理由私は知りません。

    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);
        }
    }

パフォーマンスを得るために、あなただけの価値がさらに複雑になり、下位レベルのデータ型とループを使用している場合は自分自身で測定する必要があります。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=228348&siteId=1