要求就是将数据库中保存的护士,从周一到周日按早、中、晚、夜四班排班。排班人数由用户所定:i2,i3,i4、i5。且考虑夜半年龄上限i1,并将结果显示在表格中。代码如下 
              //将数据库中保存的护士读到id[],name[],age[] 
                try{ 
        sql="SELECT * FROM nurse"; 
        rs=db.getResult(sql); 
        ResultSetMetaData rsmd=rs.getMetaData(); 
        rs.last(); 
        int rNum=rs.getRow(); 
        rs.first(); 
        id=new String[rNum]; 
        name=new String[rNum]; 
        age=new int[rNum]; 
        
        while(rs.next()) 
        { 
        //rs.next(); 
        id[i]=(String)rs.getObject("ID"); 
        name[i]=(String)rs.getObject("name"); 
        age[i]=Integer.parseInt(rs.getObject("age").toString()); 
        this.i++; 
        } 
        

catch(Exception e) 

JOptionPane.showMessageDialog(null,"读取信息错误!"); 

            
            //排班人数由用户所定:i2,i3,i4、i5 
            int i1 = Integer.parseInt((String)comb1.getSelectedItem()); 
            int i2 = Integer.parseInt((String)comb2.getSelectedItem()); 
    int i3 = Integer.parseInt((String)comb3.getSelectedItem()); 
            int i4 = Integer.parseInt((String)comb4.getSelectedItem()); 
    int i5 = Integer.parseInt((String)comb5.getSelectedItem()); 
            row=i2+i3+i4+i5; 
            
            //区分夜班年龄 
              youngid=new String[i]; 
            youngname=new String[i]; 
            oldid=new String[i]; 
            oldname=new String[i]; 
            for(int j=0;j <i;j++){ 
            if(age[j] <i1){ 
                youngid[y]=id[j]; 
              youngname[y]=name[j]; 
            y++; 
            } 
            else{ 
            oldid[d]=id[j]; 
            oldname[d]=name[j]; 
            d++; 
            } 
            } 
            //定义表格 
model = new DefaultTableModel(columnNames, row); 
        table = new JTable(model); 
    JScrollPane tablePane = new JScrollPane(table); 
con.add(tablePane, BorderLayout.CENTER); 
                
            //先排夜班 
    Random ran=new Random(); 
    for(int x=1;x <8;x++) 
    for(int m=0;m <i5;m++) 
    { 
                        //表格第一列为班种 
        table.setValueAt("夜班",row-i5+m,0); 
                        ???table.setValueAt(youngname[ran.nextInt(y)],row-i5+m,x);     }  
            ???怎么写排班才合理,才能做到一周上班数公平,班次又不冲突

解决方案 »

  1.   

    按周进行排班.
    首先,一周内,所有班的人次总和为:int num = (i2+i3+i4+i5)*7
    那么,创建一个List,用来存放排班顺序,(我们知道,这个List的大小,应该是num)
    其次,楼主要会,从所有带排的员工里面,随机取出不重复的员工
    将随机取出的不重复的员工,按先后顺序,存放到List里面(一般员工总数量不会大于num,如果大于,则采用其他方法)
    如果,一次的不重复员工序列,没有填满List,那么,再进行一次随机不重复的取员工序列,填入List,直到添满.之后,就是将序列进行排位了.
    由于只有夜班,有年龄约束,所以,一般情况下先排夜班.
    叠代List里面,满足夜班约束的员工,将其排入相应的班次,同时,从List里面进行删除.不满足的不进行操作.最后,排早,中,晚的班次.也是要叠代List,将其排入相应的班次,同时,从List里面进行删除
      

  2.   

    哦,
    简单点,你使用一个HashSet进行辅助操作就可以了.
    我们知道,HashSet里面的元素是不会重复的,所以,循环向HashSet里面放置随机获得的员工对象,
    当HashSet的大小size发生变化时,证明你填加的是一个新的对象.size不变说明你添加的是已有的对象。
      

  3.   

    还有一点,值得说明的是 ,楼主在程序设计的时候,没有引进面向对象的观念。具体一点来说,就是,应该把每一个员工的信息,设计成一个Java类,其对象保存员工的信息。数据库操作,一般也封装一个类来进行。这样,一个数据库的查询操作,所得的结果,应该是一个List对象(或者一个员工信息的数组对象),对象里面所存放的都是查询出来的员工信息对象。通过覆盖equals方法,使得对象通过员工ID来区分不同的员工,而不是默认的通过内存地址来区分不同的对象。That's All