我是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;
}
这只会返回从添加到“学校”的第一个教室对象中取得最高成绩的学生。我究竟做错了什么?很抱歉,我的问题很长,我想尽量保持清楚!
答案 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
来继续执行代码。
但是请确保您使用highestGrade
或highestValue
,而不是两个都使用。正如您的代码所示,我看不到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);