访问arraylist的arraylist的arraylist的元素?

时间:2018-11-11 10:56:00

标签: java arraylist arrayofarrays

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

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,它是Student对象的ArralyList:

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

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

并且该类包括以下方法:添加Student对象,列出该类中的所有学生(listAllStudentsInClassroom),该方法将返回Student的ArrayList,查找该类中成绩最高的Student(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;
     }

这只会返回从添加到“学校”的第一个教室对象中取得最高成绩的学生。我究竟做错了什么?很抱歉,我的问题很长,我想尽量保持清楚!

2 个答案:

答案 0 :(得分: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中。
但这是与程序的正确性不相关的优化。

答案 1 :(得分: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);