访问arraylist的arraylist的arraylist的元素?

Access elements of arraylist of arraylist of arraylist?

我是 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 Class,这是一个 Student 对象的 ArralyList:

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

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

而这个 class 包括添加 Student 对象的方法,列出 class(listAllStudentsInClassroom)中的所有学生,其中 return 是一个 ArrayList Student,在class(getHighestGradeStudent)中找到成绩最高的Student,得到成绩高于一定数量的学生列表。 最后是class School,它是Classroom:

的ArrayList
public class School
{
 private ArrayList<Classroom> school;

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

这包括添加 class 对象的方法,它应该包括 return 有史以来成绩最高的学生的方法,以及来自所有 class 的学生的列表成绩比某个高。但是,我只能获取迭代仅添加的第一个 class 的方法!到目前为止,这里是 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;
     }

这只是 return 添加到学校的第一个 class 房间对象中成绩最高的学生。我究竟做错了什么?抱歉问题太长了,我尽量说清楚了!

据我了解你的问题,你已经有一个函数 Classroom.getHighestGradeStudent() 可以让你成为那个 class 中最好的学生。您还可以获取给定学生的成绩,因为 Student 对象包含 .finalGrade.

您想遍历学校所有 class 房间,找到成绩最高的学生。

所以你有 for 循环,它遍历 class 房间。对于每个 class 房间,您都会得到一些任意学生的期末成绩:

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

这可能不是您想要的。相反,您想要那个 class 房间里最好的学生的成绩。为此,您应该改用

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

(如果我的假设是错误的并且您没有给定 class 房间的函数 getHighestGradeStudent(),您需要循环 listAllStudentsInClassroom() 的结果(或存储该列表已排序))

然后,如果当前 class 房间的最佳学生比您之前拥有的更好,则您可以通过更新存储的最佳学生 s 继续您的代码在 s.
但请确保您使用 highestGradehighestValue,而不是同时使用它们。就您的代码而言,我没有在任何地方看到 highestValue 定义。


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

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

所以您已经让您的学生存储在 s 中,只需执行 s = bestOfClassroom 而不是再次搜索整个列表。
但这是一个优化,不应该与程序的 正确性 相关。

如果您已经可以在 class 中获得最高分的学生,您可以为所有 class 获得最高分的学生,并从所有这些中找出最高分。

// 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);