public void simple(){
//日期
String[] date={"2019-10-01","2019-10-02","2019-10-03","2019-10-04","2019-10-05","2019-10-06","2019-10-07"};
String[][] schedate=new String[date.length][];
//课程 假设每天安排6节课
Integer num=6;
String[] schedual={"语文","数学","英语","社会","自然","体育","信息技术"};
int scheLength=schedual.length;
//安排1年级1班的排课表 固定教室等。
int index=0;
for(int i=0;i<date.length;i++){
//初始化 具体天的数据
schedate[i]=new String[num];
for(int j=0;j<num;j++){
//分配课程
schedate[i][j]=String.valueOf(index++%scheLength);
}
}
//打印排好的课程
display(date, schedate, schedual);
System.out.println("=== 添加课程对应教师的排课表===");
//代课老师 代课老师中的计数器保存
Map<Integer,Integer> treeMap=new TreeMap<Integer,Integer>();
for(int i=0;i<scheLength;i++){
treeMap.put(i,0);
}
//创建代课老师
String[][] teachers=new String[scheLength][];
for(int i=0;i<scheLength;i++){
teachers[i]=new String[7-i];
for(int j=0;j<teachers[i].length;j++){
teachers[i][j]=String.valueOf(j);
}
}
//对代课老师进行分配
index=0;
for(int i=0;i<schedate.length;i++){
//初始化 具体天的数据
for(int j=0;j<schedate[i].length;j++){
//定位课程
int sch=index++%scheLength;
Integer indexTeacher=treeMap.get(sch);
//定位课程对应的教师
schedate[i][j]+="-"+teachers[sch][indexTeacher];
//保存排课后教师的指针序列号
treeMap.put(sch,(++indexTeacher)%teachers[sch].length);
}
}
//打印排好的课程
for(int k=0;k<schedate.length;k++){
System.out.print(date[k]+" |");//日期
for(int t=0;t<schedate[k].length;t++){
//t 是每天安排的课程数
//schedate[k][t] 是具体的课程
String[] temp= schedate[k][t].split("-");
System.out.print(schedual[Integer.valueOf(temp[0])]+"-");
System.out.print(teachers[Integer.valueOf(temp[0])][Integer.valueOf(temp[1])]+" |");
}
System.out.println();
}
//如果有多个班级排课 例如 1-1班 1-2班 ,2-1班 2-2班 2-3班
String[] classes={"1-1","1-2","2-1","2-2","2-3"};
//按照常规,几个班的课程表相同,仅限于老师数量完全满足情况下,
//现实是老师需要共享
index=0;
for(int k=0;k<classes.length;k++){
for(int i=0;i<date.length;i++){
//初始化 具体天的数据
schedate[i]=new String[num];
for(int j=0;j<num;j++){
//分配课程时需要校验 改课程是否有老师,没有就需要调整课程
//设想 在同一时间框架下 无论是 老师-课程,教室 都应该放在一个池子里
//多个班级排班 就从池子(队列)里那对应的 资源,用完后 释放线程。先进先出
//如果没有对应的资源,可以拿池子中现有的资源进行排课,再在大的规则下进行调整。
//或者是把教师都放在队列1中,让每个班级依次拿,key1
//把教室放在队列2中,让每个班级依次拿,key2
//同时拿到key1 和key2 认为是有效的排课。 设置每个班级 每天拿key的次数
// 通常满课需满足 1班级排课=1个老师+1个教室配对
//如果不能满足上述条件 没有资源的班级 可排课为自习
schedate[i][j]=String.valueOf(index++%scheLength);
}
}
System.out.println(classes[k]+"的排班记录:");
display(date, schedate, schedual);
}
//如果教室不是固定的 配置上课对应的教室
// 由于每天要上6节课,如果该班级的备用教室为3个
}
private void display(String[] date, String[][] schedate, String[] schedual) {
for(int k=0;k<schedate.length;k++){
System.out.print(date[k]+" |");
for(int t=0;t<schedate[k].length;t++){
System.out.print(schedual[Integer.valueOf(schedate[k][t])]+" |");
}
System.out.println();
}
}
排课系统的浅思考
最新推荐文章于 2025-12-21 16:15:50 发布
400

被折叠的 条评论
为什么被折叠?



