排课系统的浅思考

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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大巨魔战将

如果对您有帮助,请打赏1分钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值