关于效率

一个场次安排,我花了两天把绕口令般的需求看懂,然后再花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 "参赛队伍不足,无法进行场次安排!";
		}
	}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值