簡體   English   中英

從文件中讀取數據並存儲它們的最佳方式

[英]Best way to read data from a file and store them

我正在從一個學生文件中讀取數據,其中每一行都是一個學生,然后我將該數據轉換為一個學生 object 並且我想返回一個學生對象數組。 我目前通過將每個學生 object 存儲在 arraylist 中然后將其作為標准 Student[] 返回來執行此操作。 使用 arraylist 來獲得動態大小的數組然后將其轉換為標准數組以進行返回是否更好,或者我應該首先計算文件中的行數,制作該大小的 Student[] 然后填充該數組。 或者是否有更好的方法來完全做到這一點。

如果有幫助,這是代碼:

public Student[] readStudents() {
        String[] lineData;
        ArrayList<Student> students = new ArrayList<>();
        while (scanner.hasNextLine()) {
            lineData = scanner.nextLine().split(" ");
            students.add(new Student(lineData));
        }
        return students.toArray(new Student[students.size()]);
    }

哪個更好取決於你需要什么和你的數據集大小。 需求可能是——最簡單的代碼、最快的加載、最少 memory 的使用、對結果數據集的快速迭代……選項可能是

  1. 對於一次性腳本或小型數據集(數萬個元素),可能什么都行。
  2. 也許根本不存儲元素,並在讀取它們時處理它們? - 最少使用 memory,適用於非常大的數據集。
  3. 使用預分配數組 - 如果您提前知道數據集大小 - 保證至少 memory 分配 - 但計算元素本身可能很昂貴。
  4. 如果不確定 - 使用 ArrayList 收集元素。 如果您可以提前估計數據集大小的上限,那么它的工作效率最高,假設您知道通常不超過 5000 個元素。 在這種情況下,創建具有 5000 個元素的 ArrayList。 如果支持數組已滿,它將自行調整大小。
  5. LinkedList - 可能是最保守的 - 它分配空間 go 但每個元素所需的 memory 比 arrays 或 ArrayLists 更大,迭代速度更慢。
  6. 您自己的數據結構針對您的需求進行了優化。 通常這種努力是不值得的,所以只有當您已經知道要解決的問題時才使用此選項。

關於 ArrayList 的注意事項:它首先預分配一個帶有一組槽的數組,然后在沒有 memory 重新分配的情況下填充這些槽。 只要后備數組已滿,就會分配一個新的更大的數組,並將所有元素移入其中。 默認情況下,新數組大小是先前數組大小的兩倍 - 通常這不是問題,但如果新數組無法獲得足夠連續的 memory 塊,可能會導致 memory 不足。

將數組用於固定大小的數組。 對於學生來說情況並非如此,因此 ArrayList 更適合,正如您在閱讀時看到的那樣。 從 ArrayList 到數組的轉換是多余的。

然后,使用最通用的類型,這里是List接口。 實現, ArrayList or LinkedList那么就是一個技術實現問題。 您稍后可能會更改具有其他運行時行為的其他實現。

但是您的代碼可以處理各種List ,這確實是一個強大的概括。

這里有一個不完整的有用接口列表和一些實現

  • 列表 - ArrayList(速度快,有點 memory 開銷),LinkedList
  • Set - HashSet(快速),TreeSet(是一個 SortedSet)
  • Map - HashMap(快速),TreeMap(是一個 SortedMap),LinkedHashMap(插入順序)

所以:

public List<Student> readStudents() {
    List<Student> students = new ArrayList<>();
    while (scanner.hasNextLine()) {
        String[] lineData = scanner.nextLine().split(" ");
        students.add(new Student(lineData));
    }
    return students;
}

在代碼審查中,人們會評論構造函數Student(String[] lineData) ,這有可能在未來更改數據。

暫無
暫無

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

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