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