Java 用于保存课程要求的数据结构

Java 用于保存课程要求的数据结构,java,data-structures,Java,Data Structures,我正在努力寻找一种有效的方法,将课程要求存储在课程中 e、 g: 当你通过B级考试时,你可以参加A级课程 当你通过C和D课程时,你也可以参加A课程 我希望能够使用树状结构,这样我就可以很容易地检查一个人是否通过了所有的要求,但由于通过要求有多种选择,这是不可能的 你知道解决这个问题的技术或数据结构吗?有很多方法可以实现你想要的,就个人而言,我认为最简单的方法是拥有一个ArrayListp.isFulfilledBy(student)); } } 公共课先决条件{ 所需课程的私人名单; 公共布

我正在努力寻找一种有效的方法,将课程要求存储在课程中

e、 g:

  • 当你通过B级考试时,你可以参加A级课程
  • 当你通过C和D课程时,你也可以参加A课程
我希望能够使用树状结构,这样我就可以很容易地检查一个人是否通过了所有的要求,但由于通过要求有多种选择,这是不可能的


你知道解决这个问题的技术或数据结构吗?

有很多方法可以实现你想要的,就个人而言,我认为最简单的方法是拥有一个
ArrayList

例如,如果您想添加一个可能的需求选项,您可以创建一个包含课程的
ArrayList
,并将其推到需求的末尾

稍后检查,只需运行组合,复杂性不应该是一个问题,例如,如果您有10个可能的要求,每个课程10门,最坏的情况下,它将是一个10x10的循环,10²到计算机是完全一样的


有很多方法可以实现你想要的,就个人而言,我认为最简单的方法就是拥有一个
ArrayList

例如,如果您想添加一个可能的需求选项,您可以创建一个包含课程的
ArrayList
,并将其推到需求的末尾

稍后检查,只需运行组合,复杂性不应该是一个问题,例如,如果您有10个可能的要求,每个课程10门,最坏的情况下,它将是一个10x10的循环,10²到计算机是完全一样的


A
课程
对象有一个
先决条件
对象列表,只需满足其中一个。
先决条件
对象具有所需的
课程
对象列表,所有这些对象都需要传递才能满足
先决条件
对象

公共课{
私人名单先决条件;
公共布尔值canBeTakenBy(学生){
返回先决条件。isEmpty()||
先决条件.stream().anyMatch(p->p.isFulfilledBy(student));
}
}
公共课先决条件{
所需课程的私人名单;
公共布尔值由(学生)完成{
返回requiredCourses.stream().allMatch(学生::已通过);
}
}
公立班学生{
私人设置的合格课程;
公共布尔值已通过(课程){
返回passedCourses.contains(课程);
}
}

A
课程
对象有一个
先决条件
对象列表,只需满足其中一个。
先决条件
对象具有所需的
课程
对象列表,所有这些对象都需要传递才能满足
先决条件
对象

公共课{
私人名单先决条件;
公共布尔值canBeTakenBy(学生){
返回先决条件。isEmpty()||
先决条件.stream().anyMatch(p->p.isFulfilledBy(student));
}
}
公共课先决条件{
所需课程的私人名单;
公共布尔值由(学生)完成{
返回requiredCourses.stream().allMatch(学生::已通过);
}
}
公立班学生{
私人设置的合格课程;
公共布尔值已通过(课程){
返回passedCourses.contains(课程);
}
}

树只是图形的一种特殊形式。我建议您看看Guava的图形库:您可以使用状态机(这不是一个数据结构)。听起来像是
课程
可以有
集合需求
,集合中的每个列表都定义了一组需求。如果一个
参加了任何列表中的所有
课程
s,则满足了要求。树只是图形的一种特殊形式。我建议您看看Guava的图形库:您可以使用状态机(这不是一个数据结构)。听起来像是
课程
可以有
集合需求
,集合中的每个列表都定义了一组需求。如果一个
参加了任何列表中的所有
课程
s,则该要求已得到满足。我提出了相同的解决方案,但我认为必须有更明智的方法来实现目标。我提出了相同的解决方案,但我认为必须有更明智的方法来实现目标。
public class Course {
    private List<Prerequisite> prerequisites;

    public boolean canBeTakenBy(Student student) {
        return prerequisites.isEmpty() ||
               prerequisites.stream().anyMatch(p -> p.isFulfilledBy(student));
    }
}

public class Prerequisite {
    private List<Course> requiredCourses;

    public boolean isFulfilledBy(Student student) {
        return requiredCourses.stream().allMatch(student::hasPassed);
    }
}

public class Student {
    private Set<Course> passedCourses;

    public boolean hasPassed(Course course) {
        return passedCourses.contains(course);
    }
}