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(); } }