我的程序读取包含学生信息的文本文件,并将每行数据放入具有各种属性的新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方法?
答案 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
并在多个其他方法上对其执行操作。一种方法如下:
readStudent
的顶部定义一个全局变量,比如studentList
readStudent()
中返回列表,而是将每个新的Student
对象添加到全局变量studentList
studentList
的每个方法调用中,只需引用全局变量,而不是再次运行readStudent()
。 此全局变量的示例实现可能如下所示:
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