【问题标题】:Best way to read data from a file and store them从文件中读取数据并存储它们的最佳方式
【发布时间】:2020-02-12 12:52:29
【问题描述】:

我正在从一个学生文件中读取数据,其中每一行都是一个学生,然后我将该数据转换为一个学生对象,并且我想返回一个学生对象数组。我目前正在通过将每个学生对象存储在一个数组列表中然后将其作为标准学生 [] 返回来执行此操作。使用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()]);
    }

【问题讨论】:

  • CSV 文件处理有一个很好的答案(就像你的情况一样,除了分隔符是` ` 而不是,stackoverflow.com/a/55085305/4062197
  • 我现在去看看,谢谢
  • 现在返回类型可以是任何东西。它是从退货开始的,只是主要打印出来。我只是使用了一个数组,因为我不需要任何其他数据类型的任何特性
  • 您好,您可以在作业中使用流吗?
  • 这不是为了分配,我的意思是它是并且我通过使用数组列表来完成它。这只是让我想知道执行此操作的标准方法是什么。我只是觉得我没有真正的理由使用数组列表,所以回答你的问题是的。什么都可以用

标签: java arrays arraylist


【解决方案1】:

哪个更好取决于您的需求和您的数据集大小。需求可能是 - 最简单的代码、最快的加载、最少的内存使用、对结果数据集的快速迭代......选项可能是

  1. 对于一次性脚本或小型数据集(数以万计的元素),可能任何方法都可以。
  2. 也许根本不存储元素,并在您阅读它们时对其进行处理? - 使用的内存最少,适用于非常大的数据集。
  3. 使用预先分配的数组 - 如果您事先知道数据集的大小 - 保证内存分配最少 - 但计算元素本身可能很昂贵。
  4. 如果不确定 - 使用 ArrayList 收集元素。如果您可以提前估计数据集大小的上限,它将最有效,例如您知道通常不超过 5000 个元素。在这种情况下,创建包含 5000 个元素的 ArrayList。如果后备数组已满,它将自行调整大小。
  5. LinkedList - 可能是最保守的 - 它会随手分配空间,但每个元素所需的内存更大,迭代速度比数组或 ArrayList 慢。
  6. 您自己的数据结构已针对您的需要进行了优化。通常这种努力是不值得的,因此只有在您已经知道要解决的问题时才使用此选项。

关于 ArrayList 的注意事项:它从预先分配具有一组插槽的数组开始,这些插槽随后被填充而无需重新分配内存。只要后备数组已满,就会分配一个新的更大的数组并将所有元素移入其中。默认情况下,新数组的大小是之前的两倍 - 通常这不是问题,但如果新数组无法获得足够的连续内存块,则会导致内存不足。

【讨论】:

    【解决方案2】:

    将数组用于固定大小的数组。对于并非如此的学生,因此 ArrayList 更适合,正如您在阅读时看到的那样。从 ArrayList 到数组的转换是多余的。

    然后,使用最通用的类​​型,这里是List 接口。实现,ArrayListLinkedList 然后是技术实现问题。您稍后可能会使用其他运行时行为更改其他实现。

    但是您的代码可以处理各种Lists,这确实是一个强大的概括。

    这里是一些实现的有用接口的不完整列表

    • List - ArrayList(速度快,内存开销很小),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),这可能会导致未来数据发生变化。

    【讨论】:

      猜你喜欢
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      相关资源
      最近更新 更多