簡體   English   中英

從文件中流式傳輸n個整數列表以創建n個對象數組

[英]Stream a list of n-integers from a file to create n object array

假設每個T對象都可以實例化為

T tobj = new T(//int value);

因此,要在由空格分隔的文件中從整數創建T []數組,請執行以下操作:

 BufferedReader br;
 FileReader fr;
 int[] arr;
 try{               
        fr = new FileReader(fo); // assume "fo" file name
        br = new BufferedReader(fr);
        arr = Arrays.stream(br.readLine().split("\\s")).mapToInt(Integer::parseInt).toArray();

 }catch(SomeException e){//something else}

T[] tobjarr = new T[arr.length];
    for(int i=0; i<arr.length; ++i)){
        tobjarr[i] = new T(arr[i]);
    }

1.上述方法在時間和空間使用方面是否有效?

2.還有其他辦法嗎? 如果是這樣,它與上述方法相比如何?

一般來說,你的方法很好。 但是,您可以使用單個流級聯來實現 與您的原始方法相比,這可以節省您一次迭代

另請注意,現在我們使用稱為NIO的 Javas新I / O API讀取文件。 一個很大的優點是它提供了Stream方法。 例如, Files#lines方法在文件的所有行上返回一個流,非常適合您的方法。

總而言之,這是完整的代碼:

String file = ...
Pattern separator = Pattern.compile("\\s");

try (Stream<String> lines = Files.lines(Paths.get(file))) {
    T[] values = lines                      // Stream<String> lines
        .flatMap(separator::splitAsStream)  // Stream<String> words
        .mapToInt(Integer::parseInt)        // IntStream values
        .mapToObj(T::new)                   // Stream<T> valuesAsT
        .toArray(T[]::new);
} catch (IOException e) {
    System.out.println("Something went wrong.");
}

請注意,此代碼與您的代碼略有不同,因為您的代碼只處理一行並挖掘所有行 如果您不需要,可以更改:

List<T[]> valuesPerLine = Files.lines(Paths.get(file))  // Stream<String> lines
    .map(separator::splitAsStream)  // Stream<Stream<String>> wordsPerLine
    .map(lineStream -> {
        return lineStream                 // Stream<String> words
            .mapToInt(Integer::parseInt)  // IntStream values
            .mapToObj(T::new)             // Stream<T> valuesAsT
            .toArray(T[]::new);
    })                              // Stream<T[]> valuesPerLine
    .collect(Collectors.toList());

與原始方法的主要區別在於我們可以使用mapToObj(T::new) (或者只是map如果它是常規流而不是IntStream )將IntStream轉換為Stream<T>mapToObj(T::new)元素傳遞給構造函數。 之后,我們使用toArray(T[]::new)Stream<T>收集到一個數組中。

T[] array = Arrays.stream(br.readLine().split("\\s"))
    .map(s -> new T(Integer.parseInt(s)))
    .toArray(T[]::new)

編輯:注意到你使用的是不同的分隔符

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM