假设一个部门20个人,每周星期一到星期五工作,每天都需要有一个人值班,由这20个人轮流值班
如何用JAVA实现,每天是星期X由XXX值班,请给出代码,谢谢
下面这个代码是我写的,当只有五个人的时候的轮换!谢谢大家了 !
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;public class Demo1 { /**
 * @param args
 */
public static void main(String[] args) {
Map map = new HashMap();
/*
 * 将星期和ID放入Map中,然后根据数据库中的ID对应找相应的人
 * 由于我这里没有数据库,这里就用MAP代替数据库了
 */ 

map.put("星期一", "张一");
map.put("星期二", "张二");
map.put("星期三", "张三");
map.put("星期四", "张四");
map.put("星期五", "张五");

// 根据系统时间获得当前日期
Demo1 d = new Demo1();
int j=d.getDay();
System.out.println(j); switch(j){
case 1:
System.out.println("星期一");
System.out.print("今天值班的人是"+map.get("星期一"));
break;
case 2:
System.out.println("星期二");
System.out.print("今天值班的人是"+map.get("星期二"));
break;
case 3:
System.out.println("星期三");
System.out.print("今天值班的人是"+map.get("星期三"));
break;
case 4:
System.out.println("星期四");
System.out.print("今天值班的人是"+map.get("星期四"));
break;
case 5:
System.out.println("星期五");
System.out.print("今天值班的人是"+map.get("星期五"));
break;
}
}
//此方法用来获得系统当前是星期几
public int getDay() { 
int i=0;
Calendar cal = Calendar.getInstance(); 
cal.setTime(new Date()); 
i=cal.get(Calendar.DAY_OF_WEEK);
int j=i-1;
return j; 
}
}
 

解决方案 »

  1.   

    你可以将所有人的名字放入一个字符串里面,并用竖线隔开:
    比如:String name = "John|Tom|Jerry";
    当你取出星期几的时候,对你取出来的字符串进行加工:
    String[] temp=(String)(map.get("星期一")).split("\\|");
    然后 就可以输出来了:
    for(String str:temp)
    {
       System.out.println(str);
    }
      

  2.   

    你看一下这样行不????
    是不是你想要的结果,拿去运行一下:import java.util.Calendar; 
    import java.util.Date; 
    import java.util.HashMap; 
    import java.util.Map; class Demo1 { /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
    Map<String,String> map = new HashMap<String,String>(); 
    /* 
    * 将星期和ID放入Map中,然后根据数据库中的ID对应找相应的人 
    * 由于我这里没有数据库,这里就用MAP代替数据库了 
    */ map.put("星期一", "张一"); 
    map.put("星期二", "张二"); 
    map.put("星期三", "张三"); 
    map.put("星期四", "张四|Tom|Jerry|Lucy|John"); 
    map.put("星期五", "张五"); // 根据系统时间获得当前日期 
    Demo1 d = new Demo1(); 
    int j=d.getDay(); 
    System.out.println(j); switch(j){ 
    case 1: 
    System.out.println("星期一"); 
    System.out.print("今天值班的人是"+map.get("星期一")); 
    break; 
    case 2: 
    System.out.println("星期二"); 
    System.out.print("今天值班的人是"+map.get("星期二")); 
    break; 
    case 3: 
    System.out.println("星期三"); 
    System.out.print("今天值班的人是"+map.get("星期三")); 
    break; 
    case 4: 
    String[] name = map.get("星期四").split("\\|");
    System.out.println("星期四");
    System.out.print("今天值班的人是");
    for(String str:name)
    {
    System.out.print(str+",");

    System.out.println();
    break; 
    case 5: 
    System.out.println("星期五"); 
    System.out.print("今天值班的人是"+map.get("星期五")); 
    break; 


    //此方法用来获得系统当前是星期几 
    public int getDay() { 
    int i=0; 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(new Date()); 
    i=cal.get(Calendar.DAY_OF_WEEK); 
    int j=i-1; 
    return j; 

      

  3.   

    把它放到一个一维的数组里面就行了:int index=0;
    String[] name = new String[]{"Tom","Jerry","John"};
    int day=0;
    int temp=new Date().getDay();
    if(day!=temp)
    {
        index++;
        day=temp;
        System.out.println("今天值班的人为:"+name[index]);
    }
    if(index==name.length)
    {
       index=0;
    }
      

  4.   

    呵呵,挺有意思的,写了一个参考一下,可以设置排班的起始时间、设定每周的休息日。import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;public class Demo1 {    public static void main(String[] args) {
            // 设置 6 位员工
             String[] emps = {"a", "b", "c", "d", "e", "f"};
            
            // 从 2007 年 12 月 20 日开始进行排班
             Calendar c = new GregorianCalendar(2007, Calendar.DECEMBER, 20, 0, 0, 0);
            
            WorkSchedule schedule = new WorkSchedule(c.getTime(), emps);        // 输出结果
             for(int i = 1, k = c.get(Calendar.DAY_OF_WEEK); i < k; i++) {
                System.out.print("            ");
            }        // 输出之后 300 天的排班结果
             for(int i = 0; i < 300; i++) {
                int week = c.get(Calendar.DAY_OF_WEEK);
                if(week == 1) {
                    System.out.println();
                }
                System.out.printf("%tm-%<td %-4s  ", c, schedule.getEmployeeDuty(c));
                c.add(Calendar.DATE, 1);
            }        System.out.println("\n");        // 当前天的值班人员
             System.out.printf("今天 %tF 是 %s 值班%n", new Date(), schedule.getEmployeeDuty());
        }
    }class WorkSchedule {
        /**
         * 排班的开始时间
          */
        private Calendar startDate;    /**
         * 员工列表,首次排班从第一位员工开始
          */
        private String[] employees;    /**
         * 休息日
          */
        private int[] dayoff;    /**
         * 每天的毫秒数
          */
        private static long DAY_MILLISECOND = 24L * 3600 * 1000;    /**
         * 使用周六、周日作为休息日的构造
          * @param startDate
         * @param employees
         */
        public WorkSchedule(Date startDate, String[] employees) {
            this(startDate, employees, new int[]{Calendar.SUNDAY, Calendar.SATURDAY});
        }    /**
         * @param startDate     排班的起始时间
          * @param employees     员工表,在起始时间时,由 employees[0] 员工值班
          * @param dayoff        休息日
          */
        public WorkSchedule(Date startDate, String[] employees, int[] dayoff) {        
            if(!checkStartDate(startDate, dayoff)) {
                // 如果 startDate 为休息日,则抛出异常
                 throw new IllegalStateException(startDate + " is dayoff!");
            }
            this.startDate = pruneDate(startDate);
            this.employees = employees;
            this.dayoff = dayoff;
        }    /**
         * 获得当天的值班员工
          * @return
         */
        public String getEmployeeDuty() {
            Calendar c = Calendar.getInstance();
            return getEmployeeDuty(pruneDate(c));
        }    /**
         * 获得某一 Date 值班的员工
          * @param date  
         * @return
         */
        public String getEmployeeDuty(Date date) {
            Calendar c = pruneDate(date);    
            return getEmployeeDuty(c);
        }    /**
         * 获得某一 Calendar 值班的员工
          * @param calendar
         * @return
         */
        public String getEmployeeDuty(Calendar calendar) {
            if(!checkStartDate(calendar, dayoff)) {
                // 如果那一天为休息日,则返回 NULL
                return "NULL";
            }
            int workDay = diffWorkDay(calendar);
            return employees[workDay % employees.length];
        }    /**
         * 计算 current 与 startDate 相差的工作天数(除去设定的休息日)
          * @param current
         * @return
         */
        private int diffWorkDay(Calendar current) {
            long diff = (current.getTimeInMillis() - startDate.getTimeInMillis()) / DAY_MILLISECOND;
            return (int)(diff - ((diff + startDate.get(Calendar.DAY_OF_WEEK) - 1) / 7) * dayoff.length);
        }    private Calendar pruneDate(Date date) {
            Calendar c = Calendar.getInstance();
            c.setTime(date);        
            return pruneDate(c);
        }    /**
         * 修剪日期,将小时及以下的时间单位置 0
         * @param c
         * @return
         */
        private Calendar pruneDate(Calendar c) {
            c.set(Calendar.HOUR, 0);
            c.set(Calendar.MINUTE, 0);
            c.set(Calendar.SECOND, 0);
            c.set(Calendar.MILLISECOND, 0);
            return c;
        }    private boolean checkStartDate(Date date, int[] dayoff) {
            Calendar c = Calendar.getInstance();
            c.setTime(date);
            return checkStartDate(c, dayoff);
        }    /**
         * 检查日期是否属于工作日
          * @param date
         * @param dayoff
         * @return
         */
        private boolean checkStartDate(Calendar date, int[] dayoff) {
            int week = date.get(Calendar.DAY_OF_WEEK);
            for(int i = 0; i < dayoff.length; i++) {
                if(week == dayoff[i]) {
                    return false;
                }
            }
            return true;
        }
    }
      

  5.   

    下面这三个方法改一下:    /**
         * 获得当天的值班员工
          * @return
         */
        public String getEmployeeDuty() {
            return getEmployeeDuty(Calendar.getInstance());
        }
        
        /**
         * 获得某一 Date 值班的员工
          * @param date  
         * @return
         */
        public String getEmployeeDuty(Date date) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            return getEmployeeDuty(calendar);
        }
        
        /**
         * 获得某一 Calendar 值班的员工
          * @param calendar
         * @return
         */
        public String getEmployeeDuty(Calendar calendar) {
            if(!checkStartDate(calendar, dayoff)) {
                // 如果那一天为休息日,则返回 NULL
                return "NULL";
            }
            calendar = pruneDate(calendar);
            int workDay = diffWorkDay(calendar);
            return employees[workDay % employees.length];
        }
      

  6.   

    弱弱的问一句:
    lz 可不可以这样,先把这20个人放在一个列表里面,然后再给他们编号如 1-20 ,在用一个字段来存前一天值班人的编号,到今天的时候把前一天值班人的id+1 不就行了?不知道意思理解对了没 ?
    -------------------------------------------------------------
                Quietly through  .....
      

  7.   

    如果  是数据库中有一个表 里面包含两个字段  ID 和 NAME  写个SQL让数据库无限循环 是不是也可以 这样通过数据库就可以解决了!但问题是如何设定这个循环的时间(也就是说这个SQL语句要每天自动运行一次)
      

  8.   


    import java.util.Date;
    import java.util.Calendar;
    public class Demo1
    {
    public Worker getWorker()
        {
    Date today=new Date();
    Calendar cal=Calendar.getInstance();
    cal.setTime(today);
    //休息
    if(7==cal.get(Calendar.DAY_OF_WEEK) || 1==cal.get(Calendar.DAY_OF_WEEK))
    {
    return new Worker();

    }

    SchInfo info=DBHelper.getSchInfo();
    //今天和库中日期一样
    if(0!=today.compareTo(info.getDate()))
    {
    return DBHelper.getWorkerById(info.getId());

    }
    //今天和库中日期不一样
    java.util.List<Worker> workerList=DBHelper.getAllWorker();
    //找到下一个当班职工
    Worker turnWorker=new Worker();
    for(int i=0;i<workerList.size();i++)
    {
    if(info.getId()==workerList.get(i).getId())
    {
    int index=(i+1)%workerList.size();
    turnWorker.setId(workerList.get(index).getId());
    turnWorker.setName(workerList.get(index).getName());

    break;

    }
    }
    //更新调度表
    info.setDate(new java.sql.Date(today.getTime()));
    info.setId(turnWorker.getId());
    DBHelper.setSchInfo(info);

         return turnWorker;
        
        }




    public static void main(String []args)
    {
    new Demo1().getWorker();
    }
    }
    class Worker
    {
    public Worker()
    {

    }

    public int getId()
    {
    return id;
    }
    public void setId(int id)
    {
    this.id = id;
    }
    public String getName()
    {
    return name;
    }
    public void setName(String name)
    {
    this.name = name;
    }


    private int id;
    private String name;

    }
    class SchInfo
    {
    public SchInfo()
    {

    }


    public java.sql.Date getDate()
    {
    return date;
    }
    public void setDate(java.sql.Date date)
    {
    this.date = date;
    }
    public int getId()
    {
    return id;
    }
    public void setId(int id)
    {
    this.id = id;
    }

    private java.sql.Date date;
    private int id;

    }
    class DBHelper
    {
    public static SchInfo getSchInfo()
    {
    //取得数据库中保存的上次调度信息,封闭到SchInfo中返回
    return new SchInfo();

    }
    public static void setSchInfo(SchInfo info)
    {
    //更新调度信息

    }
    public static java.util.List<Worker> getAllWorker()
    {
    //返回按ID号排序后的Worker信息
    return new java.util.ArrayList<Worker>();

    }
    public static Worker getWorkerById(int id)
    {
    //返回对应ID的员工信息
    return new Worker();
    }
    }
      

  9.   

    假设一个部门20个人,每周星期一到星期五工作,每天都需要有一个人值班,由这20个人轮流值班 
    如何用JAVA实现,每天是星期X由XXX值班,请给出代码,谢谢 不懂,20人,5天,那岂不是固定的顺序了。呵呵呵!1 日期循环,计数器清零
    2 如果是1-5 则计数器加一,同时%5,得到一个余数,然后让对应此index的人员值班就行了。
    3 继续循环%5 是因为有5个人,如果12个人值班,则%12. 注意数组的index 从0开始