访问arraylist的arraylist的元素



我是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,它是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(的方法,该方法返回学生的ArrayList,查找该类中成绩最高的学生(getHighestGradeStudent(,以及成绩高于一定数量的学生的列表。最后,课堂学校,这是一个课堂排列列表:

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

这包括添加类对象的方法,还应该包括返回有史以来成绩最高的学生的方法,以及来自所有级别高于某个级别的学生的列表。然而,我只能通过添加的第一个类来迭代方法!以下是迄今为止getHighestGradeStudent的代码:

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;
}

这只会返回添加到学校的第一个课堂对象中成绩最高的学生。我做错了什么?抱歉问了这么长的问题,我尽量说清楚!

如果你已经可以获得一个班级中得分最高的学生,你可以获得所有班级的分数,并在所有班级中找到最高的分数。

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

根据我对您的问题的理解,您已经有了一个函数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 = bestOfClassroom,而不是再次搜索整个列表,就可以将您的学生存储在s
但这是一个优化,与程序的正确性无关。

最新更新