如何调用其他 类 的列表?
How do I call a list from other classes?
好的,我正在构建一个程序来对学生的成绩和记录进行排序。它是一个命令行程序,当 运行 时,它将通过询问用户输入来启动。有exit(退出程序)、load [file name](加载一个文件名)、student [student name](加载学生记录)等几个命令,其他的不重要。好吧,基本上我想知道的和我坚持的是所有这些功能将在单独的 classes 中,并且会在用户输入特定命令时调用,但是如果我将 "load" 命令放入它自己的 class,那么我如何让它与其他 class 共享它的信息?我知道我必须使用 BufferReader 来读取文件,但我将如何实现我的负载 class,或者如果有更好的方法,请随意说。到目前为止,这是我的代码。我的其他 classes 没有太多内容,因为我觉得我需要先弄清楚如何读入并与其他 classes 共享文件。
import java.util.*;
import java.io.*;
public class program7
{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
System.out.println("Grade Stats by ");
System.out.print(">");
while(scan.hasNextLine())
{
String input = scan.nextLine();
if(input.equals("exit"))
{
System.exit(0);
}
else if(input.equals("help"))
{
System.out.println("exit - program closes.");
System.out.println("load [filename] - loads a class database specified in [filename].");
System.out.println("students - prints out a list of students from the class, along ");
System.out.println(" with total points, and final grades for each student.");
System.out.println("assignments - prints out a list of assignments from the file, along with points possible");
System.out.println("student [student name] - Prints report for the student");
System.out.print(">");
}
else if(input.contains("load"))
{
String[] split = input.split(" ");
LoadStudents loadStudents = new LoadStudents(split[1]);
loadStudents.getFromFile();
System.out.print(">");
}
else if(input.equals("students"))
{
Students students = new Students();
students.printer();
System.out.print(">");
}
else if(input.equals("assignments"))
{
System.out.print(">");
}
else if(input.contains("student"))
{
String[] split = input.split(" ");
Student student = new Student(split[1]);
System.out.print(">");
}
else if(input.contains("assignment"))
{
}
else if(input.equals("grades"))
{
}
else
{
System.out.println("exit - program closes.");
System.out.println("load [filename] - loads a class database specified in [filename].");
System.out.println("students - prints out a list of students from the class, along ");
System.out.println(" with total points, and final grades for each student.");
System.out.println("assignments - prints out a list of assignments from the file, along with points possible");
System.out.println("student [student name] - Prints report for the student");
System.out.print(">");
}
}
}
}
那是我的主要 class,但这是我的负载和学生 class。
import java.util.*;
import java.io.*;
public class LoadStudents
{
public String inputFile;
public List<Object> info = new ArrayList<Object>();
public LoadStudents(String inputFile)
{
this.inputFile = inputFile;
}
public List<Object> getFromFile()
{
try
{
BufferedReader in = new BufferedReader(new FileReader(inputFile));
try
{
String line = "";
while(in.readLine() != null)
{
line = in.readLine();
info.add(line);
}
}
catch(IOException e)
{
System.err.println("Exception, man");
}
finally
{
in.close();
}
}
catch(FileNotFoundException e)
{
System.err.println("File wasnt found ");
}
catch(IOException e)
{
System.err.println("Exception, man");
}
return info;
}
}
import java.util.*;
public class Students
{
public Students()
{
}
public void printer()
{
List<Object> info = (new LoadStudents()).getFromFile();
for (int x = 0; x<info.size(); x++)
{
System.out.println(info.get(x));
}
}
}
学生 class 尚未完成,但我正在尝试弄清楚如何从其他 class 中读取列表。我已经完成研究并看到了 3 个类似的问题,但他们仍然缺少一些东西,因为我不断收到错误
.\Students.java:11: error: constructor Load in class Load cannot be applied to g
iven types;
List<Object> info = (new LoadStudents()).getFromFile();
^
required: String
found: no arguments
reason: actual and formal argument lists differ in length
1 error
我知道它需要输入,但我希望它使用用户在输入命令时提供的先前输入 "input [whateverfile]"。
谁能告诉我如何将我的 Load class 生成的列表调用给任何其他 class?
有很多方法可以做到这一点。我的建议是您的 Load
class 应该是一个从文件中实际创建 Student
列表的工厂,而不是字符串列表。
这里有更多建议:
Load
class 可以有所有方法静态并且它可以是不可实例化的。你在这个class中的字段在读取文件后就没有用了,你可以将它们作为参数传递给静态方法。
Load
不是 class 的好名字。 LoadStudents
更有意义,甚至更好StudentFactory
.
Load
和 Student
可能不需要 public,package-private 就足够了。这些 classes 中的所有方法都相同。始终使用尽可能低的能见度。
data()
也不是该方法的好名称。 getStudents()
之类的东西,或者如果您遵循上述建议,getFromFile()
更有意义。
- 总是 print/log 异常的堆栈跟踪,否则你甚至不知道 what/where 它发生了。
- 与其让用户键入整个命令,不如在每个选项上输入一个数字,让用户按数字 select,这样键入速度更快,并且您还可以避免打字错误。
- 仅导入您实际使用的 classes 而不是整个包,这将使编译速度更快(除非您从该包导入大量 classes ,这里不是这种情况)。
编辑:既然你还不明白我的意思,这里有一个例子:
class StudentFactory {
private static List<Student> listCache = new ArrayList<>();
static List<Student> getStudents(final String filePath) {
if (listCache.isEmpty() {
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader(filePath));
String line;
while((line = in.readLine()) != null) {
// Parse the line and create a Student instance from it, then add it to the list
listCache.add(student);
}
} catch(IOException e) {
System.err.println("Exception, man");
e.printStackTrace();
} catch(FileNotFoundException e) {
System.err.println("File wasnt found ");
e.printStackTrace();
} finally {
if (in != null) in.close();
}
}
return listCache;
}
private StudentFactory() {
// Avoid instantiation
}
}
那你就可以了
final List<Student> listOfStudents = StudentFactory.getStudents(filePath);
从代码中的任何位置获取学生列表。 filePath
如果您之前已经通过它,则可以为 null。
好的,我正在构建一个程序来对学生的成绩和记录进行排序。它是一个命令行程序,当 运行 时,它将通过询问用户输入来启动。有exit(退出程序)、load [file name](加载一个文件名)、student [student name](加载学生记录)等几个命令,其他的不重要。好吧,基本上我想知道的和我坚持的是所有这些功能将在单独的 classes 中,并且会在用户输入特定命令时调用,但是如果我将 "load" 命令放入它自己的 class,那么我如何让它与其他 class 共享它的信息?我知道我必须使用 BufferReader 来读取文件,但我将如何实现我的负载 class,或者如果有更好的方法,请随意说。到目前为止,这是我的代码。我的其他 classes 没有太多内容,因为我觉得我需要先弄清楚如何读入并与其他 classes 共享文件。
import java.util.*;
import java.io.*;
public class program7
{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
System.out.println("Grade Stats by ");
System.out.print(">");
while(scan.hasNextLine())
{
String input = scan.nextLine();
if(input.equals("exit"))
{
System.exit(0);
}
else if(input.equals("help"))
{
System.out.println("exit - program closes.");
System.out.println("load [filename] - loads a class database specified in [filename].");
System.out.println("students - prints out a list of students from the class, along ");
System.out.println(" with total points, and final grades for each student.");
System.out.println("assignments - prints out a list of assignments from the file, along with points possible");
System.out.println("student [student name] - Prints report for the student");
System.out.print(">");
}
else if(input.contains("load"))
{
String[] split = input.split(" ");
LoadStudents loadStudents = new LoadStudents(split[1]);
loadStudents.getFromFile();
System.out.print(">");
}
else if(input.equals("students"))
{
Students students = new Students();
students.printer();
System.out.print(">");
}
else if(input.equals("assignments"))
{
System.out.print(">");
}
else if(input.contains("student"))
{
String[] split = input.split(" ");
Student student = new Student(split[1]);
System.out.print(">");
}
else if(input.contains("assignment"))
{
}
else if(input.equals("grades"))
{
}
else
{
System.out.println("exit - program closes.");
System.out.println("load [filename] - loads a class database specified in [filename].");
System.out.println("students - prints out a list of students from the class, along ");
System.out.println(" with total points, and final grades for each student.");
System.out.println("assignments - prints out a list of assignments from the file, along with points possible");
System.out.println("student [student name] - Prints report for the student");
System.out.print(">");
}
}
}
}
那是我的主要 class,但这是我的负载和学生 class。
import java.util.*;
import java.io.*;
public class LoadStudents
{
public String inputFile;
public List<Object> info = new ArrayList<Object>();
public LoadStudents(String inputFile)
{
this.inputFile = inputFile;
}
public List<Object> getFromFile()
{
try
{
BufferedReader in = new BufferedReader(new FileReader(inputFile));
try
{
String line = "";
while(in.readLine() != null)
{
line = in.readLine();
info.add(line);
}
}
catch(IOException e)
{
System.err.println("Exception, man");
}
finally
{
in.close();
}
}
catch(FileNotFoundException e)
{
System.err.println("File wasnt found ");
}
catch(IOException e)
{
System.err.println("Exception, man");
}
return info;
}
}
import java.util.*;
public class Students
{
public Students()
{
}
public void printer()
{
List<Object> info = (new LoadStudents()).getFromFile();
for (int x = 0; x<info.size(); x++)
{
System.out.println(info.get(x));
}
}
}
学生 class 尚未完成,但我正在尝试弄清楚如何从其他 class 中读取列表。我已经完成研究并看到了 3 个类似的问题,但他们仍然缺少一些东西,因为我不断收到错误
.\Students.java:11: error: constructor Load in class Load cannot be applied to g
iven types;
List<Object> info = (new LoadStudents()).getFromFile();
^
required: String
found: no arguments
reason: actual and formal argument lists differ in length
1 error
我知道它需要输入,但我希望它使用用户在输入命令时提供的先前输入 "input [whateverfile]"。 谁能告诉我如何将我的 Load class 生成的列表调用给任何其他 class?
有很多方法可以做到这一点。我的建议是您的 Load
class 应该是一个从文件中实际创建 Student
列表的工厂,而不是字符串列表。
这里有更多建议:
Load
class 可以有所有方法静态并且它可以是不可实例化的。你在这个class中的字段在读取文件后就没有用了,你可以将它们作为参数传递给静态方法。Load
不是 class 的好名字。LoadStudents
更有意义,甚至更好StudentFactory
.Load
和Student
可能不需要 public,package-private 就足够了。这些 classes 中的所有方法都相同。始终使用尽可能低的能见度。data()
也不是该方法的好名称。getStudents()
之类的东西,或者如果您遵循上述建议,getFromFile()
更有意义。- 总是 print/log 异常的堆栈跟踪,否则你甚至不知道 what/where 它发生了。
- 与其让用户键入整个命令,不如在每个选项上输入一个数字,让用户按数字 select,这样键入速度更快,并且您还可以避免打字错误。
- 仅导入您实际使用的 classes 而不是整个包,这将使编译速度更快(除非您从该包导入大量 classes ,这里不是这种情况)。
编辑:既然你还不明白我的意思,这里有一个例子:
class StudentFactory {
private static List<Student> listCache = new ArrayList<>();
static List<Student> getStudents(final String filePath) {
if (listCache.isEmpty() {
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader(filePath));
String line;
while((line = in.readLine()) != null) {
// Parse the line and create a Student instance from it, then add it to the list
listCache.add(student);
}
} catch(IOException e) {
System.err.println("Exception, man");
e.printStackTrace();
} catch(FileNotFoundException e) {
System.err.println("File wasnt found ");
e.printStackTrace();
} finally {
if (in != null) in.close();
}
}
return listCache;
}
private StudentFactory() {
// Avoid instantiation
}
}
那你就可以了
final List<Student> listOfStudents = StudentFactory.getStudents(filePath);
从代码中的任何位置获取学生列表。 filePath
如果您之前已经通过它,则可以为 null。