从其他方法引用ArrayList而不重新创建它

时间:2014-04-23 03:57:59

标签: java arraylist

我的程序读取包含学生信息的文本文件,并将每行数据放入具有各种属性的新Student对象中。

然后循环将每个Student对象放入ArrayList,允许使用其他方法搜索学生数据。

不过,我已经能够使这项工作的唯一方法是调用每个搜索方法的readStudent方法,这意味着输入文件处理和ArrayList中一再创造。

这是读取输入文件,创建对象并将对象放入ArrayList:

的方法
public class readStudent
{

   public static List< Student > readStudent() throws Exception {
   Scanner input = new Scanner(new File("students.txt")); 
   List< Student > studentList = new ArrayList< Student >();

   while (input.hasNext()) {

        int id = input.nextInt();
        String lastName = input.next();
        String firstName = input.next();            
        int gradYear = input.nextInt();

        Student student = new Student(id, firstName, lastName, gradYear);
        studentList.add(student);

    }
    return studentList;
}

这是一种搜索方法,也在readStudent类中(为简洁起见略微编辑):

 public static void allRecords() throws Exception {
    List< Student > studentList = readStudent.readStudent(); 
    int size = studentList.size();

    for (int i=0; i<size; i++) {

        System.out.printf("%-5d %10s %10s %15d\n", studentList.get(i).returnId(), studentList.get(i).returnFirst(), studentList.get(i).returnLast(), studentList.get(i).returnGrad());
    }

}

其他搜索方法都以List&lt;学生&gt; studentList = readStudent.readStudent();使数组可供搜索。

我的问题是:是否可以执行readStudent方法一次创建ArrayList,可能在main的开头,然后从搜索方法引用ArrayList而不必每次都重新运行整个readStudent方法?

5 个答案:

答案 0 :(得分:1)

一个简单的解决方案是创建一个类级别List,并在main的开头只初始化一次。然后在整个代码中使用它。

    public class readStudent
{

    private static List< Student > studentList;

    public static void main(String[] args)
    {
        studentList = readStudent();

    // all other code...
    }


    static someMethod(){

        // use studentList directly
    }


}

确保您的代码是线程安全的。

答案 1 :(得分:0)

是的,您可以创建一个全局变量并将readStudent()引用到List <Student>全局变量,这样您就不必每次都重新运行readStudent方法。

答案 2 :(得分:0)

List< Student > studentList = new ArrayList< Student >();方法之外声明readStudent(),如果您在初始化后调用readStudent()方法,则可以在ReadStudent类中的任何位置使用它。

答案 3 :(得分:0)

是的,可以只创建一次ArrayList并在多个其他方法上对其执行操作。一种方法如下:

  1. 在班级readStudent的顶部定义一个全局变量,比如studentList
  2. 不是在方法readStudent()中返回列表,而是将每个新的Student对象添加到全局变量studentList
  3. 在查询studentList的每个方法调用中,只需引用全局变量,而不是再次运行readStudent()
  4. 此全局变量的示例实现可能如下所示:

    public class readStudent
    {
           public static List<Student> studentList = new ArrayList<Student>();
    
           public static void main(String[] args) {
               readStudent(); //to initialize studentList
               //other methods here
           }
    
           public static void readStudent() throws Exception {
           Scanner input = new Scanner(new File("students.txt")); 
    
           while (input.hasNext()) {
    
                int id = input.nextInt();
                String lastName = input.next();
                String firstName = input.next();            
                int gradYear = input.nextInt();
    
                Student student = new Student(id, firstName, lastName, gradYear);
                studentList.add(student);
            }
    
        }
    }
    

    allRecords()

     public static void allRecords() throws Exception 
     {
        int size = studentList.size();
        for (int i=0; i<size; i++) {
            System.out.printf("%-5d %10s %10s %15d\n", studentList.get(i).returnId(), studentList.get(i).returnFirst(), studentList.get(i).returnLast(), studentList.get(i).returnGrad());
        }
    }
    

答案 4 :(得分:0)

在像这样的类语法之后在开始时在任何方法之外声明列表

return