我正在制作一个时间表应用程序。重要的课程是:
Period
id: int
clazz: Clazz
SubjectTeacher
subject: String
teacher: String
clazz: Clazz
AllocablePeriods: List<Period>
以下是示例数据,其中Jane和John在一个班级教授,Jane在另一个班级教授。
{sub435, Jane-Algebra-Class1, {1,2,3,4,5,6,7,8}}
{sub124, Jane-Calculus-Class2, {9,10,11,12,13,14,15,16}}
{sub875, John-English-Class1, {1,2,3,4,5,6,7}} //he cannot take #8
我的目标是为每个SubjectTeacher
检测可能的互换。例如,在上面的示例中,Jane-Algebra-Class1
和John-English-Class1
具有潜在的互换
{1,Jane-Algebra-Class1,John-English-Class1}
{2,Jane-Algebra-Class1,John-English-Class1}
...
{7,Jane-Algebra-Class1,John-English-Class1}
检测所有SubjectTeacher
s的所有可能交换的好算法/技术是什么?
答案 0 :(得分:2)
我希望AllocablePeriods
的数量相对较小。那么你可以做的就是遍历所有教师,迭代他们所有的时期,并将每个这样的时期添加到一个地图,将一个时期标识符映射到可以在此期间教授的教师:
Map<Integer, List<String> > periodTeachersMap = new HashMap<Integer, List<String>>();
for (Teacher teacher: teachers) {
for (AllocablePeriod period: teacher.getPeriods()) {
if (periodTeachersMap.get(period.getId()) == null) {
periodTeachersMap.put(period.getId(), new ArrayList<String>());
}
periodTeachersMap.get(period.getId()).add(teacher.getName());
}
}
在这个周期之后,每个时期都会有periodTeachersMap
所有可以教授的老师。如果你想要这些对,你可以很容易地从List中构建它们。我希望这会对你有所帮助。