使用其他对象的方法对对象列表进行排序

时间:2020-10-18 12:51:21

标签: java list sorting stream

这是问题所在:我有一个名为Student的类。在Student中,我有一个ArrayList<Student>字段,名称为students。我也有一个班级名称Course。代码是这样的:

public class Student{
    public ArrayList<Student> students  = new ArrayList<Student>();
    public ArrayList<Course> studentCourses  = new ArrayList<Course>();
    //...
class Course{
    double score;
    
    public double getScore(){
        return this.score;
    }
    //...
}

我有一个Student对象调用allStudents,其中包含我所有的学生,其格式为Student

我想按特定课程的分数对这些学生进行排序。怎么可能呢?如果缺少任何信息,请随时发表评论。我将更新这个问题。

任何帮助都会得到高度重视

1 个答案:

答案 0 :(得分:1)

您的“学生”类令人困惑。根据名称,听起来这堂课应该代表一个学生。但随后您将在其中包含一个List<Student>,这意味着每个Student对象将包含指向零个或多个其他Student对象的指针。这种关系代表什么?为什么一个学生引用其他许多学生?

您的“课程”课程也令人困惑,因为它仅包含一个分数。如果我要定义一门大学课程,那么我想它会代表特定年份的学校/学院/大学中的一门课程,并且它需要包含以下信息才能完整:

  • 课程名称
  • 课程开始的年份
  • 已注册参加本课程的学生
  • 该课程涉及的测试/考试/评估
  • 每个学生在课程中获得的总分或成绩

如果这是一项家庭作业,并且保持简单,那么您可能会忽略单个测试/考试/评估以及开学年。但是您仍然需要确定一种将总分映射到每个学生的方法。

假设您创建一个代表单个学生的“学生”类(并将学生数据库类重命名为“学生”),则只需在“课程”类中创建一个Map<Student, Score>。 (如果分数只是数字值,则可以使用Map<Student, Integer>。)但是请注意,如果将Student对象用作Map键,则需要覆盖equals和您的“学生”类中的hashcode方法,以便它们正常工作。区分人(姓名,生日等)的最好方法是在每个人注册时给他们分配一个序列号。因此,您的“学生”类可以只包含一个ID序列号为long的字段,然后您的equalshashcode方法将简单地检查并使用这个唯一值。

或者,您可能希望在“学生”课程Map<Course, Score>中添加地图,以便每个学生都可以跟踪其课程成绩。选择什么取决于您的应用程序最常访问分数(获取每个学生的课程分数或获取每个课程的学生分数,或同时获取这两者)。

但是总的信息是,您创建的每个类都需要代表一件事,并且您需要精确地决定什么。然后,您需要确定每个类需要哪些字段才能完全表示该东西。