3

我是 Java 新手,我目前正在将 BlueJ 用于一个项目。我在访问此类对象的 ArrayList 的 ArrayList 内的对象时遇到问题。假设我有一个学生对象:

public class Student
{
 private String homeAddress;
 private String monthBorn;
 private String yearBorn;
 private int;

 public Student(String homeAddress, String monthBorn, String yearBorn,  
 int finalGrade)
 {
   this.homeAddress = homeAddress;
   this.monthBorn = monthBorn;
   this.yearBorn = yearBorn;
   this.finalGrade = finalGrade;
  }
}

然后是获取地址、月份、年份和年级的方法。然后我有一个类 Class,它是一个学生对象的 ArralyList:

    public class Classroom
    {
      private String classroom;
      private ArrayList<Student> listOfStudents;

     public Classroom (String classroom)
     {
      this.classroom = classroom;
      listOfStudents = new ArrayList<Student>();
     }
   }

这个类包括添加学生对象的方法,列出类中的所有学生(listAllStudentsInClassroom),它返回一个学生的ArrayList,找到类中成绩最高的学生(getHighestGradeStudent),以及一个学生列表高于一定数量的等级。最后是 School 类,它是 Classroom 的 ArrayList:

public class School
{
 private ArrayList<Classroom> school;

 public School()
 {
  school = new ArrayList<Classroom>();
  }
}

这包括添加类对象的方法,它应该包括返回具有最高成绩的学生的方法以及所有班级中成绩高于某个班级的学生的列表。但是,我只能通过添加的第一个类来迭代方法!到目前为止,这是 getHighestGradeStudentEver 的代码:

    public Student getHighestGradeStudentEver ()
    {
      Student s = school.get(0).getHighestGradeStudent();
      int highestGrade =   school.get(0).listAllStudentsInClassroom().get(0).getFinalGrade();
      for(int i =1; i< school.size(); i++){
        int highestGrade = school.get(i).listAllStudentsInClassroom().get(i).getFinalGrade();
       if(value > (highestValue)){
           highestValue = value;
           s = school.get(i).getHighestGradeStudent();
           }
         }
      return s;
     }

这仅返回从添加到学校的第一个教室对象中成绩最高的学生。我究竟做错了什么?对不起,这个问题很长,我尽量说清楚!

4

2 回答 2

2

如果您已经可以在一个班级中获得最高分的学生,那么您可以在所有班级中获得最高分,并从所有班级中找出最高分。

// find the highest grade in each class
ArrayList<Student> highestInEachClass = new ArrayList<>();
for (Classroom classroom : school) {
    highestInEachClass.add(classroom.getHighestGradeStudent());
}

// find the highest grade overall
Student highestGradeStudent = highestInEachClass.get(0);
for (Student student : highestInEachClass) {
    if (highestGradeStudent.getFinalGrade() < student.getFinalGrade()) {
        highestGradeStudent = student;
    }
}
return highestGradeStudent;

或者,使用Stream

return school.stream().flatMap(x -> x.getListOfStudents().stream())
                      .sorted(Comparator.comparing(Student::getFinalGrade).reversed())
                      .findFirst().orElse(null);
于 2018-11-11T11:49:06.217 回答
2

据我了解您的问题,您已经有了一个功能Classroom.getHighestGradeStudent(),可以为您提供该班最好的学生。您还可以获取给定学生的成绩,因为 Student 对象包含.finalGrade.

您想遍历学校的所有教室,并找到成绩最高的学生。

所以你有你的 for 循环,它在教室中迭代。对于每个教室,您都会得到一些学生的期末成绩:

int highestGrade = school.get(i).listAllStudentsInClassroom().get(i).getFinalGrade();
                                                                  ^

这可能不是您想要的。相反,您想要该教室中最好的学生成绩。为此,您应该改用

int highestGrade = school.get(i).getHighestGradeStudent().getFinalGrade();

(如果我的假设是错误的,并且您没有getHighestGradeStudent()给定教室的功能,则需要循环遍历listAllStudentsInClassroom()(或存储排序的列表)的结果)

然后,s如果当前教室的最佳学生比您以前在s.
但请确保您使用其中一个highestGradehighestValue,而不是同时使用它们。正如您的代码所代表的那样,我没有看到highestValue任何地方定义。


请注意,如果您只搜索给定班级中最好的学生一次,则可以使此代码更高效。我会做

Student bestOfClassroom = school.get(i).getHighestGradeStudent();
int highestGrade = bestOfClassroom.getFinalGrade();

所以你已经有了你的学生,s只需简单地做s = bestOfClassroom而不是再次搜索整个列表。
但这是一个与程序的正确性无关的优化。

于 2018-11-11T11:24:30.627 回答