循环中循环的愚蠢错误

时间:2014-03-21 20:03:08

标签: java

所以我有一个程序,我创建新学生,为该学生添加成绩,添加学生从中获得成绩的班级名称,然后将学生添加到我的学生名单。

由于有许多不同的课程,往往会发生同一个学生进入多个课程并且在所有课程中都有成绩。

但这会使我的程序仍然创建一个新的学生,即使它已经存在也很难。

这就是代码现在寻找创建学生的方式:

List<Student> students = new ArrayList<>();

        for(Path adress:files){
            BufferedReader textIn = new BufferedReader(new FileReader(adress.toString()));
            String line;
            while((line = textIn.readLine()) != null){
                String[] readContent = line.split(" ");
                System.out.println(students.size());
                for(int i = 0; i < students.size(); i++){
                    if(students.get(i).askName().equals(readContent[0])){
                        //something i do when Student exists
                    }else{
                        Student student = new Student(readContent[0],adress.toString());
                        for(int y = 1;y < readContent.length; y++){
                            student.addGrade(readContent[y]);
                        }
                        students.add(student);  
                    }
                }
            }
        }

正如您所看到的,我想通过首先浏览我的学生列表并查看Student.get(i).askNAme()是否等于我的学生列表中的任何一个来解决多个具有相同名称的学生的问题。但这会造成循环永远不会开始的情况。

你会如何以一种好的方式解决这个问题?我认为在开始时只为此添加一名空学生并不合适。

整个主要课程:

package files;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) throws IOException {

        Path lessons = Paths.get("../text/students");
        FileVisitor file = new FileVisitor();
        Files.walkFileTree(lessons, file);

        List<Path> files = file.askFiles();
        List<Student> students = new ArrayList<>();

        for(Path adress:files){
            BufferedReader textIn = new BufferedReader(new FileReader(adress.toString()));
            String line;
            while((line = textIn.readLine()) != null){
                String[] readContent = line.split(" ");
                System.out.println(students.size());
                for(int i = 0; i < students.size(); i++){
                    if(students.get(i).askName().equals(readContent[0])){

                    }else{
                        Student student = new Student(readContent[0],adress.toString());
                        for(int y = 1;y < readContent.length; y++){
                            student.addGrade(readContent[y]);
                        }
                        students.add(student);  
                    }
                }
            }
        }
        PrintWriter output = new PrintWriter(new FileWriter("../text/opilased_out"));
        for(Student i:students){
            output.printf("Nimi: %s\t|\tKeskmine hinne: %f\t|\tAine: %s\n", i.askName(), i.askMedian(), i.askSubject());
        }
        output.close();
    }
}

1 个答案:

答案 0 :(得分:1)

像这样的东西应该作为最内层的循环

boolean found = false;
for(int i = 0; i < students.size() && !found; i++){
    if(students.get(i).askName().equals(readContent[0])){
        //something i do when Student exists
        found = true;
    }
}
if(!found){
    Student student = new Student(readContent[0],adress.toString());
    for(int i = 1; i < readContent.length; i++){
        student.addGrade(readContent[i]);
    }
    students.add(student);  
}