0

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

作业按以下顺序排列优先级:

  1. 今天在特定时间到期
  2. 今天到期,没有具体时间
  3. 在未来日期到期,按升序排序
  4. 没有截止日期
  5. 未来开始日期(不包括在报告中)

当应用程序运行时,输入工作班次的开始和结束时间。该时间段会自动按优先级顺序填充作业。

考虑:

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,这十个工作将按以下顺序排列优先级:01-02-09-10-05-06. 03-04-07-08由于未来的开始日期,作业将被排除在外。

考虑:在 01/02,我进入办公室进行四小时轮班,1200-1600然后将这些数据输入调度程序。

从那里开始,我需要以下魔法发生:

  1. 从我的开始时间开始,添加最优先的工作。
  2. 如果该作业是专门安排的作业,请保留该时间,以免其他作业覆盖它。
  3. 一旦具有特定时间的所有工作都在日历中,从第一个职位空缺开始填写约会,直到日历被填满,然后停止。

按照这个逻辑,以下是数据如何填写时间表。

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

到目前为止,我的优先级逻辑工作得很好。我可以正确地将第一条记录捕获到时间表中。但是后来,我迷失在了alendaring 部分,尤其是如何保持某个时间段以便没有任何内容覆盖它,并且不超过开始和结束时间。我正在努力寻找一种有效的方法来构建填充日历的方法。我是否创建了一个 15 分钟的存储桶数组,并在遍历任务列表时用约会填充这些存储桶?每次我安排一个事件并通过调度程序传递另一个事件时,我是否会以某种方式传递 anewStartTime并返回顶部?newEndTime事件是在记忆中举行的吗?或在填充特定插槽时写入数据库?Java中是否有一个预定义的类已经做到了这一点而我错过了它?天哪……那会很尴尬……

我现在离这个太近了,并且无法想象一个好的策略。任何建议、观察和通用伪代码都会有所帮助。

4

1 回答 1

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 中,以便它们始终是有序的。这将使在尝试安排新工作时更容易和更有效地找到最佳拟合间隔。

于 2013-02-13T18:42:23.307 回答