我需要帮助设计日历和日程安排应用程序

时间:2013-02-13 18:10:38

标签: java calendar

我正在尝试创建日历和日程安排应用程序。我们有一个由短交货预约组成的数据集。开始时间,持续时间,截止日期/时间等。我们的目的是创建一个应用程序,它将为一个工作块的开始和结束时间生成一个任务列表。

按以下顺序对作业进行优先排序:

  1. 今天在特定时间到期
  2. 今天没有特定时间
  3. 截止日期,按升序排序
  4. 没有截止日期
  5. 未来开始日期(不包括在报告中)
  6. 当应用程序运行时,输入工作班次的开始和结束时间。该时间段按优先级顺序自动填充作业。

    考虑:

    Job01; Duration 10; Start 01/01; Due 01/02 1500;
    Job02; Duration 60; Start 01/01; Due 01/02;
    Job03; Duration 45; Start 01/08; Due 01/08 1500;
    Job04; Duration 30; Start 01/09; Due 01/09 1500;
    Job05; Duration 30; Start 12/31; ;
    Job06; Duration 60; Start 12/28; ;
    Job07; Duration 60; Start 01/04; ;
    Job08; Duration 60; Start 01/04; ;
    Job09; Duration 30; Start 01/01; Due 01/03 1200;
    Job10; Duration 10; Start 01/01; Due 01/05 1700;
    

    在01/02,这10个工作将按此顺序排列优先顺序:01-02-09-10-05-06。由于未来的开始日期,将排除作业03-04-07-08

    考虑一下:在01/02,我进入办公室进行了四小时轮班,1200-1600,并将此数据输入调度程序。

    从那里,我需要发生以下魔术:

    1. 从我的开始时间开始,添加优先级最高的工作。
    2. 如果作业是专门安排的作业,请保留该时间,以免其他作业覆盖它。
    3. 一旦所有具有特定时间的作业都在日历中,请继续填写从第一个空位开始的约会,直到日历填满,然后停止。
    4. 遵循该逻辑,以下是数据填写计划的方式。

      Job01 - 1500-1510
      Job02 - cannot fit in the 1510-1500 slot, so it populates 1200-1300
      Job05 - 1300-1330
      Job06 - 1330-1430
      Job09 - 1430-1500
      Job10 - 1510-1520
      

      到目前为止,我的优先级逻辑工作正常。我可以正确地捕获第一个记录到日程表。但是,我在迷失方向上迷失了方向,特别是如何保持某个时间段,所以没有任何东西覆盖它,也不会超过开始和结束时间。我正在努力用一种有效的方法来构建填充日历的方法。当我遍历我的任务列表时,我是否创建了一个15-miunte存储桶阵列并填充约会?每当我安排一个事件并通过调度程序传递另一个事件时,我是否以某种方式将newStartTimenewEndTime传递回顶部?事件是否记忆在内存中?或者在填充特定插槽时写入数据库? Java中是否有预先定义的类已经完成了这个并且我错过了它?天哪......这会让人感到尴尬......

      我现在太接近这一点了,我很难想象出一个好的策略。任何建议,观察和广义伪代码都会有所帮助。

1 个答案:

答案 0 :(得分:1)

观察/建议1: 我不清楚为什么你会想要一份工作来覆盖另一份工作。如果您已完成优先级代码并且首先添加优先级最高的作业,为什么需要覆盖时间段?我会创建一个结构,允许一个工作要求一个时间段,然后一旦声称其他工作不能声称相同的位置。

编写一个处理作业一天的作业计划类。它可以在今天的时间表中存储一份工作列表。然后可以在运行中计算可用时隙和占用时隙。如果您担心停电后数据仍然存在,那么您可以定期将对象的一些序列化写入磁盘。我真的没有看到将这些数据存储在数据库中的价值,除非您希望这个应用程序是多线程的,然后您可以将线程安全问题委托给数据库。

我建议在Job:assignedStartTime。

中添加一个字段

创建一个只存储开始时间和结束时间的TimeInterval类。

然后在Schedule中我们可以写下以下内容:

public class Schedule {

  //Finds the first time slot during the day not yet assigned to a job.
  public Interval getFirstOpenTimeSlot() { /* ...*/ }

  public Interval getLargestOpenTimeSlot() { /* ...*/ }

  public ArrayList<Job> getJobsAssigned() {  /* ...*/ }

  //Returns the Interval the given job was assigned to or null if the job cannot fit
  // in the schedule.
  public Interval assignJob(Job theJob) {  /* ...*/ }

  //returns a list of all open time slots representing the time still available for jobs.
  public ArrayList<Interval> getAllOpenTimeSlots{ /*  */ }

}

观察2: 实现assignJob时,您应该只能查找满足要求的第一个可用时隙。以这种方式进行将为您提供时间表,但可能不是最佳时间表。如果有可能无法安排所有作业的情况,您需要仔细定义最佳解决方案的外观。一个人错过了最少的工作岗位?能抓住今天到期的大部分工作的人吗?

<强>建议: 我会让Interval实现Comparable。首先按长度排序间隔,然后按开始时间排序。将间隔存储在TreeSet中,以便始终对它们进行排序。这样可以更轻松,更有效地在尝试安排新工作时找到最佳拟合间隔。