一个场次安排,我花了两天把绕口令般的需求看懂,然后再花3天时间写出了我自认为还有点内容的代码。经理看过之后大为惊讶,因为我的代码频繁的访问数据库,而且冗余很大。这些我自己开始也发现了,可是我就是在逃避,而不是想办法优化。最后的结果是经理花了一下午时间重写了这个模块,我感到脸上像被扇了一个耳光。写代码不光要实现功能,也要想尽一切办法减少程序的开销。这是我学到的教训。
下面粘出经理的程序,只为了自己学习其中的思想和方法,更是为了记住这一教训。
public String savePlan(Ccap ccap) throws Exception {
List<Csdw> csdwList = this.getDao().getList("from Csdw A where A.ssgl.kqzt=1");
if(csdwList!=null && csdwList.size()>1){
//案例背景
List<Albj> albjList = this.getDao().getList("from Albj A where A.allx = 0 and A.alzt = 1");
int alCount = albjList.size();
if(alCount==0){
return "当前无可分配的案例背景!";
}
//确定参赛队伍数量分配规则,完全分组、剩余一组、剩余两组、剩余三组
int csdwCount = csdwList.size();
int syCount = csdwCount%4;
//创建对象抽取容器
List<Integer> containt = new ArrayList<Integer>();
for(int i=0;i<csdwCount;i++){
containt.add(i);
}
//构建随机数
Random random = new Random();
//构建参赛队伍序列,分四组
int arrLen = csdwCount/4;
Csdw[] A1 = new Csdw[arrLen];
//填充参赛队伍信息
for(int i=0;i<A1.length;i++){
int ranInt = random.nextInt(containt.size());
A1[i] = csdwList.get(containt.get(ranInt));//抽取参赛队伍填充分组列表
containt.remove(ranInt);//将已抽取队伍编号清除
}
Csdw[] A2 = new Csdw[arrLen];
for(int i=0;i<A2.length;i++){
int ranInt = random.nextInt(containt.size());
A2[i] = csdwList.get(containt.get(ranInt));//抽取参赛队伍填充分组列表
containt.remove(ranInt);//将已抽取队伍编号清除
}
Csdw[] B1 = new Csdw[arrLen];
for(int i=0;i<B1.length;i++){
int ranInt = random.nextInt(containt.size());
B1[i] = csdwList.get(containt.get(ranInt));//抽取参赛队伍填充分组列表
containt.remove(ranInt);//将已抽取队伍编号清除
}
Csdw[] B2 = new Csdw[arrLen];
for(int i=0;i<B2.length;i++){
int ranInt = random.nextInt(containt.size());
B2[i] = csdwList.get(containt.get(ranInt));//抽取参赛队伍填充分组列表
containt.remove(ranInt);//将已抽取队伍编号清除
}
//比赛时间
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date=sdf.parse(ccap.getKssj());
long startTime=date.getTime();
long aStartTime=startTime;
long bStartTime=startTime;
//构建第一轮比赛场次信息
for(int i=0;i<A1.length;i++){
int ranAlbj = random.nextInt(alCount);
aStartTime+=(ccap.getBssj()+ccap.getBsje())*60000;
Date da=new Date(aStartTime);
Ccap ap = new Ccap(A1[i].getSsgl(), albjList.get(ranAlbj), "1", "A", String.valueOf(i+1),A1[i].getCsdwid(), A1[i].getCsdwmc(), 0.0, A2[i].getCsdwid(),A2[i].getCsdwmc(), 0.0,sdf.format(da), ccap.getBsje(),ccap.getBssj());
this.getDao().saveObj(ap);
}
for(int i=0;i<B1.length;i++){
int ranAlbj = random.nextInt(alCount);
bStartTime+=(ccap.getBssj()+ccap.getBsje())*60000;
Date da=new Date(bStartTime);
Ccap ap = new Ccap(B1[i].getSsgl(), albjList.get(ranAlbj), "1", "B", String.valueOf(i+1),B1[i].getCsdwid(), B1[i].getCsdwmc(), 0.0, B2[i].getCsdwid(),B2[i].getCsdwmc(), 0.0,sdf.format(da), ccap.getBsje(),ccap.getBssj());
this.getDao().saveObj(ap);
}
if(syCount==1){
//构建第二场场次信息
//剩余一组队伍
Csdw leav = csdwList.get(containt.get(0));
//随即抽取A实验室A组一组信息
int ranInt = random.nextInt(A1.length);
int ranAlbj = random.nextInt(alCount);
aStartTime+=(ccap.getBssj()+ccap.getBsje())*60000;
Date da=new Date(aStartTime);
Ccap ap = new Ccap(leav.getSsgl(), albjList.get(ranAlbj), "1", "A", String.valueOf(A1.length+1),leav.getCsdwid(), leav.getCsdwmc(), 0.0, A1[ranInt].getCsdwid(),A1[ranInt].getCsdwmc(), 0.0,sdf.format(da), ccap.getBsje(),ccap.getBssj());
A1[ranInt]=leav;
this.getDao().saveObj(ap);
}else if(syCount==2){
//构建第二场场次信息
//剩余两组组队伍,先抽取一组放入A实验室,剩余的一组放入B实验室
int ranInt = random.nextInt(containt.size());
Csdw leav = csdwList.get(containt.get(ranInt));
containt.remove(ranInt);
//随即抽取A实验室A组一组信息
ranInt = random.nextInt(A1.length);
int ranAlbj = random.nextInt(alCount);
aStartTime+=(ccap.getBssj()+ccap.getBsje())*60000;
Date da=new Date(aStartTime);
Ccap ap = new Ccap(leav.getSsgl(), albjList.get(ranAlbj), "1", "A", String.valueOf(A1.length+1),leav.getCsdwid(), leav.getCsdwmc(), 0.0, A1[ranInt].getCsdwid(),A1[ranInt].getCsdwmc(), 0.0,sdf.format(da), ccap.getBsje(),ccap.getBssj());
A1[ranInt]=leav;
this.getDao().saveObj(ap);
//最后一组
Csdw last = csdwList.get(containt.get(0));
ranInt = random.nextInt(B1.length);
ranAlbj = random.nextInt(alCount);
bStartTime+=(ccap.getBssj()+ccap.getBsje())*60000;
da=new Date(bStartTime);
Ccap apb = new Ccap(leav.getSsgl(), albjList.get(ranAlbj), "1", "B", String.valueOf(B1.length+1),last.getCsdwid(), last.getCsdwmc(), 0.0, B1[ranInt].getCsdwid(),B1[ranInt].getCsdwmc(), 0.0,sdf.format(da), ccap.getBsje(),ccap.getBssj());
B1[ranInt]=last;
this.getDao().saveObj(apb);
}else if(syCount==3){
//构建第二场场次信息
//剩余三组组队伍,先抽取一组放入A实验室,再抽取一组放入B实验室,剩余的一组放入A实验室
int ranInt = random.nextInt(containt.size());
Csdw leav = csdwList.get(containt.get(ranInt));
containt.remove(ranInt);
//随即抽取A实验室A组一组信息
ranInt = random.nextInt(A1.length);
int ranAlbj = random.nextInt(alCount);
aStartTime+=(ccap.getBssj()+ccap.getBsje())*60000;
Date da=new Date(aStartTime);
Ccap ap = new Ccap(leav.getSsgl(), albjList.get(ranAlbj), "1", "A", String.valueOf(A1.length+1),leav.getCsdwid(), leav.getCsdwmc(), 0.0, A1[ranInt].getCsdwid(),A1[ranInt].getCsdwmc(), 0.0,sdf.format(da), ccap.getBsje(),ccap.getBssj());
A1[ranInt]=leav;
this.getDao().saveObj(ap);
//第二组
ranInt = random.nextInt(containt.size());
Csdw second = csdwList.get(containt.get(0));
ranInt = random.nextInt(B1.length);
ranAlbj = random.nextInt(alCount);
bStartTime+=(ccap.getBssj()+ccap.getBsje())*60000;
da=new Date(bStartTime);
Ccap apb = new Ccap(leav.getSsgl(), albjList.get(ranAlbj), "1", "B", String.valueOf(B1.length+1),second.getCsdwid(), second.getCsdwmc(), 0.0, B1[ranInt].getCsdwid(),B1[ranInt].getCsdwmc(), 0.0,sdf.format(da), ccap.getBsje(),ccap.getBssj());
B1[ranInt]=second;
this.getDao().saveObj(apb);
//最后一组
Csdw last = csdwList.get(containt.get(0));
ranInt = random.nextInt(A2.length);
ranAlbj = random.nextInt(alCount);
aStartTime+=(ccap.getBssj()+ccap.getBsje())*60000;
da=new Date(aStartTime);
Ccap apa = new Ccap(leav.getSsgl(), albjList.get(ranAlbj), "1", "A", String.valueOf(A1.length+2),last.getCsdwid(), last.getCsdwmc(), 0.0, A2[ranInt].getCsdwid(),A2[ranInt].getCsdwmc(), 0.0,sdf.format(da), ccap.getBsje(),ccap.getBssj());
A2[ranInt]=last;
this.getDao().saveObj(apa);
}
//构建第二轮场次信息
for(int i=0;i<A1.length;i++){
int ranAlbj = random.nextInt(alCount);
aStartTime+=(ccap.getBssj()+ccap.getBsje())*60000;
Date da=new Date(aStartTime);
Ccap ap = new Ccap(A1[i].getSsgl(), albjList.get(ranAlbj), "2", "A", String.valueOf(i+1),B2[i].getCsdwid(), B2[i].getCsdwmc(), 0.0, A1[i].getCsdwid(),A1[i].getCsdwmc(), 0.0,sdf.format(da), ccap.getBsje(),ccap.getBssj());
this.getDao().saveObj(ap);
}
for(int i=0;i<B1.length;i++){
int ranAlbj = random.nextInt(alCount);
bStartTime+=(ccap.getBssj()+ccap.getBsje())*60000;
Date da=new Date(bStartTime);
Ccap ap = new Ccap(B1[i].getSsgl(), albjList.get(ranAlbj), "2", "B", String.valueOf(i+1),A2[i].getCsdwid(), A2[i].getCsdwmc(), 0.0, B1[i].getCsdwid(),B1[i].getCsdwmc(), 0.0,sdf.format(da), ccap.getBsje(),ccap.getBssj());
this.getDao().saveObj(ap);
}
return "安排成功!";
}else{
return "参赛队伍不足,无法进行场次安排!";
}
}