要求就是将数据库中保存的护士,从周一到周日按早、中、晚、夜四班排班。排班人数由用户所定: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); }
???怎么写排班才合理,才能做到一周上班数公平,班次又不冲突
//将数据库中保存的护士读到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); }
???怎么写排班才合理,才能做到一周上班数公平,班次又不冲突
首先,一周内,所有班的人次总和为:int num = (i2+i3+i4+i5)*7
那么,创建一个List,用来存放排班顺序,(我们知道,这个List的大小,应该是num)
其次,楼主要会,从所有带排的员工里面,随机取出不重复的员工
将随机取出的不重复的员工,按先后顺序,存放到List里面(一般员工总数量不会大于num,如果大于,则采用其他方法)
如果,一次的不重复员工序列,没有填满List,那么,再进行一次随机不重复的取员工序列,填入List,直到添满.之后,就是将序列进行排位了.
由于只有夜班,有年龄约束,所以,一般情况下先排夜班.
叠代List里面,满足夜班约束的员工,将其排入相应的班次,同时,从List里面进行删除.不满足的不进行操作.最后,排早,中,晚的班次.也是要叠代List,将其排入相应的班次,同时,从List里面进行删除
简单点,你使用一个HashSet进行辅助操作就可以了.
我们知道,HashSet里面的元素是不会重复的,所以,循环向HashSet里面放置随机获得的员工对象,
当HashSet的大小size发生变化时,证明你填加的是一个新的对象.size不变说明你添加的是已有的对象。