📄 pkdao.java
字号:
package com.comingnet.bean;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Random;
import com.db.DBOperator;
public class pkDAO {
public static bjpk[] pklist(int xxbh,int bjbh ){//选出该班级所要排课的课程信息,其中另加该课程老师的已排的课时数
ArrayList list0= null;
ArrayList list=null;
DBOperator dbop=new DBOperator();//h
// bjpk[] bpk=new bjpk[k];
try {
list=dbop.ExecuteSelect(false, "select b.jskcjc ,a.kcmc,a.kcjc,a.swks,a.ltshu ,a.yxdz from m_teacher b,m_class_cur a where a.jsbh=b.jsid and a.xxbh=b.xxbh and a.swks>=0 and b.xxbh="+xxbh+" and a.bjbh="+bjbh +" order by a.kcjc desc");
System.out.println("select b.jskcjc ,a.kcmc,a.kcjc,a.swks,a.ltshu ,a.yxdz from m_teacher b,m_class_cur a where a.jsbh=b.jsid and a.xxbh=b.xxbh and a.swks>=0 and b.xxbh="+xxbh+" and a.bjbh="+bjbh +"order by a.kcjc desc");
} catch (NullPointerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
bjpk[] bpk0=new bjpk[list.size()+1];
for(int i=0;i<list.size();i++){
list0=(ArrayList)list.get(i);
bjpk bjp=new bjpk();
bjp.setJskcjc(list0.get(0).toString());//该课程老师已排的课时数
bjp.setKcmc(list0.get(1).toString());
bjp.setMzcs(Integer.parseInt(list0.get(2).toString()));
bjp.setSwjs(Integer.parseInt(list0.get(3).toString()));
bjp.setLtshu(Integer.parseInt(list0.get(4).toString()));
bpk0[i+1]=bjp;
}
return bpk0;
}
public static int radoms(int h,int k){//在k和h之间生成一个随机数
int d=0;
int flag = 0; //是否已经生成过标志
while(flag==0){
Random rdm = new Random(System.currentTimeMillis());
d = Math.abs(rdm.nextInt())%k+1;
if(d>h){
flag=1;
}
}
return d;
}
public static int[] randoms(int d,int f,int swks ) {//d为学校一周的总课时数;f为某一课的一周课时数//swks为上午课时数
int[] intRet = new int[f];
int intRd = 0; //存放随机数
int count = 0;
int count0 = 0;//记录生成的随机数个数
int flag = 0; //是否已经生成过标志
while(count<swks){//产生上午课时的随机数组
Random rdm = new Random(System.currentTimeMillis());
intRd = Math.abs(rdm.nextInt())%20+1;
for(int i=0;i<count;i++){
if(intRet[i]==intRd){
flag = 1;
break;
}else{
flag = 0;
}
}
if(flag==0){
intRet[count] = intRd;
count++;
}}
int r=0;
int tep=0;
for(int l=swks;l<f;l++){//产生下午课时的随机数组
r++;
intRet[l]=radoms((r-1)*(d-20)/(f-swks)+20,r*(d-20)/(f-swks)+20);
if((intRet[l]-tep<(d-20)/(f-swks))&&l<f-1){
intRet[l]=intRet[l]+2;//避免连堂
}
tep=intRet[l];
}
for(int t=0;t<f;t++){//冒泡升序排序
int temp=0;
for(int k=f-t;k<f;k++){
if(intRet[k-1]>intRet[k]){
temp=intRet[k];
intRet[k]= intRet[k-1];
intRet[k-1]= temp;
}
}
}
for(int c=0;c<intRet.length;c++){
System.out.println("intRet"+c+"-->"+intRet[c]);
}
return intRet;//返回升序的随机数组
}
static int f=0;
public static String[] pk0(int zs,int xxbh,int bjbh ){//ZS学校一周总课时数
String [] pk=new String[zs+3];
for(int j=0;j<zs+3;j++){
pk[j]="";
}
bjpk[] pklist =pklist(xxbh,bjbh);
int count=0;
for(int j=1;j<pklist.length;j++){
int t=0;
int[] d=randoms(zs,pklist[j].getMzcs()-pklist[j].getLtshu(),pklist[j].getSwjs()-pklist[j].getLtshu());//返回该课程可能的随机升序数组;扣除连堂数,最后根据排课结果情况再填补
for(int k=0;k<d.length;k++){
System.out.println("第"+k+"-->");
if(pk[d[k]].equals("")&&!pklist[j].getJskcjc().contains(","+d[k]+",")){
System.out.println("第可用"+k+"-->"+d[k]+pklist[j].getKcmc());
pk[d[k]]=pklist[j].getKcmc();//如果随机数组对应位置的排课数组为空(可用)侧把该课程赋予课程表中
}else{//如果随机数组对应位置的排课数组不为空(不可用)侧搜索调整
if(k==0||k==d.length-1){//随机数组为第一个和最后一个时
if(k==0){for(int s=1;s<zs;s++){///随机数组为第一个搜索调整
if(pk[s].equals("")&&!pklist[j].getJskcjc().contains(","+s+",")){
System.out.println("第一个搜索"+k+"-->"+pklist[j].getKcmc());
pk[s]=pklist[j].getKcmc();
d[k]=s;
break; }
}
}else{ String mark="0";
for(int s=d[k];s<zs;s++){//随机数组为最后一个搜索调整
if(pk[s].equals("")&&!pklist[j].getJskcjc().contains(","+s+",")){
System.out.println("第最后搜索"+k+"-->"+pklist[j].getKcmc());
mark="1";
pk[s]=pklist[j].getKcmc();
d[k]=s;
break; }
}
if(mark.equals("0")){//最后一个搜索调整失败
for(int x=zs;x>0;x--){
if(pk[x].equals("")&&!pklist[j].getJskcjc().contains(","+x+",")){
System.out.println("第最后搜索"+x+"-->"+pklist[j].getKcmc());
mark="1";
pk[x]=pklist[j].getKcmc();
break; }
}
}
}
}else{//随机数组为中间一个搜索调整
String temp="false";//temp为是否搜索到标识
if(18<d[k]&&d[k]<21){
for(int b=d[k];b>0;b--) {
if(pk[b].equals("")&&!pklist[j].getJskcjc().contains(","+b+",")){
temp="true";
d[k]=b;
System.out.println("向后搜索b"+b+"-->"+pklist[j].getKcmc());
pk[b]=pklist[j].getKcmc();
break;
}
}
}
else{
for(int h=d[k];h<d[k+1];h++){//向后搜索调整到下一个随机数为止
if(!pk[h+1].equals(pklist[j].getKcmc())&&pk[h].equals("")&&!pklist[j].getJskcjc().contains(","+h+",")){
temp="true";
d[k]=h;
System.out.println("向后搜索"+h+"-->"+pklist[j].getKcmc());
pk[h]=pklist[j].getKcmc();
break;
}
}
}
if(temp.equals("false")){//向后搜索调整到下一个随机数为止搜索失败
for(int g=d[k];g>0;g--){//侧向前搜索到前一个数组为止
// System.out.println("h-->"+pk[h]);
System.out.println("pklist["+g+"].向前-->"+pklist[j].getJskcjc());
if(!pk[g-1].equals(pklist[j].getKcmc())&&pk[g].equals("")&&!pklist[j].getJskcjc().contains(","+g+",")){
temp="true";
d[k]=g;
pk[g]=pklist[j].getKcmc();
System.out.println("hq-->"+pk[g]);
break;
}
}}
if(temp.equals("false")){//如果向前搜索到前一个数组为止还是搜索失败
for(int g=1;g<zs;g++){//侧从该数组一直向后搜索到课表最后一个为止
// System.out.println("h-->"+pk[h]);
System.out.println("pklist["+g+"].后搜索到课表最后-->"+pklist[j].getJskcjc());
if(!pk[g+1].equals(pklist[j].getKcmc())&&!pk[g-1].equals(pklist[j].getKcmc())&&pk[g].equals("")&&!pklist[j].getJskcjc().contains(","+g+",")){
temp="true";
d[k]=g;
pk[g]=pklist[j].getKcmc();
System.out.println("hh-->"+pk[g]);
break;
}
}//从该数组一直向后搜索到课表最后一个为止
}
if(temp.equals("false")){
for(int g=zs;g>0;g--){
System.out.println("pklist["+g+"].后搜索到课表最前-->"+pklist[j].getJskcjc());
if(!pk[g-1].equals(pklist[j].getKcmc())&&pk[g].equals("")&&!pklist[j].getJskcjc().contains(","+g+",")){
temp="true";
d[k]=g;
pk[g]=pklist[j].getKcmc();
System.out.println("hh-->"+pk[g]);
break;
}
}
}
}
}//随机数组的调课结束
}
if(pklist[j].getLtshu()>0){
int e=0,w=0;//e为上午课时数;w为连堂数
/// 统计上午课时数和连堂数
for(int i=1;i<=20;i++){
if( pk[i].equals(pklist[j].getKcmc())){
e++;
if(i<15&&pk[i].equals(pk[i+5])){
w++;
}
}
}
for(int k=21;k<zs;k++){
if(pk[k].equals(pklist[j].getKcmc())&&pk[k+1].equals(pklist[j].getKcmc())&&((k-20)%3!=0)){
w++;
}
}
System.out.println("w--->"+w);
System.out.println("ee--->"+e);
int z=0;//后补连堂数插入成功标识
int u=0;//填补扣除的连堂数标识
for(int q=1;q<=15;q++){
if(pk[q].equals(pklist[j].getKcmc())){
if(w+z<pklist[j].getLtshu()&&pk[q+5].equals("")&&!pklist[j].getJskcjc().contains(","+(q+5)+",")){
pk[q+5]=pklist[j].getKcmc();
z++;
u++;
}
}
if(u>=pklist[j].getLtshu()) {//扣除的连堂数补足侧跳出循环
break;
}
}
if(u<pklist[j].getLtshu()&&z+w<pklist[j].getLtshu()){
for(int q=20;q>5;q--){
if(pk[q].equals(pklist[j].getKcmc())){
if(w+z<pklist[j].getLtshu()&&pk[q-5].equals("")&&!pklist[j].getJskcjc().contains(","+(q-5)+",")){
pk[q-5]=pklist[j].getKcmc();
z++;
u++;
}
}
if(u>=pklist[j].getLtshu()) {//扣除的连堂数补足侧跳出循环
break;
}
}
}
if(u<pklist[j].getLtshu()){
for(int q=1;1<20;q++) {
if(pk[q].equals("")&&!pk[q+5].equals(pklist[j].getKcmc())&&!pklist[j].getJskcjc().contains(","+q+",")){
pk[q]=pklist[j].getKcmc();
u++;
if(u>=pklist[j].getLtshu()) {//扣除的连堂数补足侧跳出循环
break;
}
}
}
}
System.out.println("u5--->"+u);
// if(w<pklist[j].getLtshu()||u<pklist[j].getLtshu()) {
}
//最后的连堂数,均匀分布统计调整
int l=0;//统计连堂数
String a1="";//该课程所在的位置,中间用逗号隔开
int k1=0;//每天的该课程的次数
int min=1; //一周里每天该课程的最小数的某一天
int max=1;// 一周里每天该课程的最大数的某一天
String a0="";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -