Java 在连接Txt文件时遇到问题

Java 在连接Txt文件时遇到问题,java,concatenation,text-files,Java,Concatenation,Text Files,我正在制作一个学生项目分配系统,读取txt文件。这将读取文件并为它们提供最佳项目。我以前尝试过在一行单独列出学生的信息(姓名、电子邮件和ID)来选择所有项目,但效果不错。然而,我试着把它们都放在一行中,当我看到有人没有选择四个项目时,我就跳过了。以下是txt文件的内容: 7 Allan,A a.allan@outlook.ac.uk 53027 1 3 4 2 Brown,B b.brown@outlook.ac.uk 456

我正在制作一个学生项目分配系统,读取txt文件。这将读取文件并为它们提供最佳项目。我以前尝试过在一行单独列出学生的信息(姓名、电子邮件和ID)来选择所有项目,但效果不错。然而,我试着把它们都放在一行中,当我看到有人没有选择四个项目时,我就跳过了。以下是txt文件的内容:

7                                   
Allan,A a.allan@outlook.ac.uk 53027 1 3 4 2
Brown,B b.brown@outlook.ac.uk 45696 1 2 3 4
Craig,C c.craig@outlook.ac.uk 45667 2 1 4 3
Douglas,D d.douglas@outlook.ac.uk 52981 3 4 1 2
Edward,E e.edward@outlook.ac.uk 45048 3
Findlay,F f.findlay@outlook.ac.uk 46904 2 1 3
Graham,G g.graham@outlook.ac.uk 58733 2 4
最上面的数字“7”是学生人数,长数字是ID,其他数字是项目编号。当调试器到达Edward,E对项目“3”的第一个也是唯一的选择时,程序认为他的第二个选择是Findlay,F,并导致NumberFormatException错误。以下是迄今为止的代码:

public Student(int id,Scanner scanner) {
        listOfPreferences=new ArrayList<Project>();
        projectID= new ArrayList<Integer>();
        setID(id);

        String name=scanner.next();
        this.setName(name);

        String email=scanner.next();
        this.setEmail(email);

        String ID = scanner.next();
        this.setID(id);

        //scanner.nextLine();
        String preferences=scanner.next();
        String totalPreferences[] = preferences.split(" ");

        String preferences2=scanner.next();
        String totalPreferences2[] = preferences2.split(" ");

        String preferences3=scanner.next();
        String totalPreferences3[] = preferences3.split(" ");

        String preferences4=scanner.next();
        String totalPreferences4[] = preferences4.split(" ");

        for(String project: totalPreferences)
        {
            projectID.add(Integer.valueOf(project));
        }


        for(String project: totalPreferences2)
        {
            projectID.add(Integer.valueOf(project));
        }

        for(String project: totalPreferences3)
        {
            projectID.add(Integer.valueOf(project));
        }

        for(String project: totalPreferences4)
        {
            projectID.add(Integer.valueOf(project));
        }
}
公立学生(int-id,扫描器){
listOfPreferences=newArrayList();
projectID=新的ArrayList();
setID(id);
字符串名称=scanner.next();
这个.setName(name);
字符串email=scanner.next();
这个.setEmail(email);
字符串ID=scanner.next();
这个.setID(id);
//scanner.nextLine();
字符串首选项=scanner.next();
字符串totalPreferences[]=preferences.split(“”);
字符串首选项2=scanner.next();
字符串totalPreferences2[]=preferences2.split(“”);
字符串首选项3=scanner.next();
字符串totalPreferences3[]=preferences3.split(“”);
字符串首选项4=scanner.next();
字符串totalPreferences4[]=preferences4.split(“”);
用于(字符串项目:totalPreferences)
{
projectID.add(Integer.valueOf(project));
}
对于(字符串项目:totalPreferences2)
{
projectID.add(Integer.valueOf(project));
}
对于(字符串项目:totalPreferences3)
{
projectID.add(Integer.valueOf(project));
}
对于(字符串项目:totalPreferences4)
{
projectID.add(Integer.valueOf(project));
}
}

我真的被卡住了,有人能帮忙吗

改变您的方法,创建独立处理每一行的代码。假设可以将一行数据放入Student类型的对象中,您可以执行以下操作:

private List<Student> students = new ArrayList<>(); 
请注意,尾随数字的数量可能不同,因此如果使用扫描仪,则需要使用
while(someScanner.hasnetint())
使用while循环来循环这些数字

例如:

public Student processLine(String line) {
    Scanner lineScanner = new Scanner(line);

    String name = lineScanner.next();
    String email = lineScanner.next();
    String id = lineScanner.next();

    List<Integer> values = new ArrayList<>();
    while(lineScanner.hasNextInt()) {
        values.add(lineScanner.nextInt());
    }       
    lineScanner.dispose(); // done with the line scanner

    // using data collected above create my data or Student?
    return new Student(...);        
}
公共学生处理行(字符串行){
扫描仪行扫描仪=新扫描仪(行);
字符串名称=lineScanner.next();
字符串email=lineScanner.next();
String id=lineScanner.next();
列表值=新的ArrayList();
while(lineScanner.hasNextInt()){
add(lineScanner.nextInt());
}       
lineScanner.dispose();//使用行扫描程序完成
//使用上面收集的数据创建我的数据还是学生?
返回新学生(…);
}

另一个问题:不要将扫描器传递到学生构造函数中,因为您不应该将逻辑类(如学生类)与UI(用户界面)代码混用。相反,给学生一个构造函数,它接受有意义的数据——名称、电子邮件、id等等。。。。并在程序的UI部分收集数据,在收集数据时创建学生对象。

如果您对发布的答案有疑问,请询问
public Student processLine(String line) {
    // code here to create a data object from each line
    // using either String#split(..)
    // or using a separate Scanner created for each line and then disposed
    return new Student(....); // create your data object from the processed line
}
public Student processLine(String line) {
    Scanner lineScanner = new Scanner(line);

    String name = lineScanner.next();
    String email = lineScanner.next();
    String id = lineScanner.next();

    List<Integer> values = new ArrayList<>();
    while(lineScanner.hasNextInt()) {
        values.add(lineScanner.nextInt());
    }       
    lineScanner.dispose(); // done with the line scanner

    // using data collected above create my data or Student?
    return new Student(...);        
}