从对象属性中找到重叠值的好算法/技术?

时间:2012-02-07 07:53:25

标签: java algorithm

我正在制作一个时间表应用程序。重要的课程是:

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-Class1John-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的所有可能交换的好算法/技术是什么?

1 个答案:

答案 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中构建它们。我希望这会对你有所帮助。