//排夜班
                      int y ;//年轻护士人数
    Random ran=new Random();
    for(int x=1;x<8;x++)
     for(int m=0;m<i5;m++)
     {
                         //i5:用户所选拍夜班人数
         table.setValueAt("夜班",row-i5+m,0);
                         //row-i5+m:在表格的后i5行显示
                         table.setValueAt(youngname[ran.nextInt(y)],row-i5+m,x);
                         //youngname[ran.nextInt(y)]:在年轻护士中产生随机护士名单
    }
           
                 ??问题:
                            现在的算法,有可能将某一护士连排俩夜班,这种问题该怎么解决?能不能帮忙写一下算法?

解决方案 »

  1.   

    跟gui没有关系吧。楼上的方法不错,简单易行。
      

  2.   

    要求就是将数据库中保存的护士,从周一到周日按早、中、晚、夜四班排班。排班人数由用户所定: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);     }  
                 ???怎么写排班才合理,才能做到一周上班数公平,班次又不冲突。         
      

  3.   

    public class Test { public Test(){
    List listHs = new ArrayList();//定义护士list集合
    //添加几个护士
    listHs.add("护士1");
    listHs.add("护士2");
    listHs.add("护士3");
    listHs.add("护士4");
    listHs.add("护士5");
    listHs.add("护士6");
    listHs.add("护士7");
    this.start(listHs);
    }
    /**
     * 给护士排班
     * @param listHs
     * */
    public void start(List listHs){
    int iHsNum = listHs.size();
    int iDelHs = 0;
    if(iHsNum == 0 ){
    return;
    }
    Random random = new Random();
    iDelHs = random.nextInt(iHsNum);
    //如果先中此护士,那么就把此护士从队列中移除
    //当然你可以把移除的护士保存在一个相对全局的变量中(List),这样就得到护士的值班次序了
    System.out.println(listHs.remove(iDelHs).toString());
    this.start(listHs);
    }

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    new Test();
    }}