我正在尝试创建日历和日程安排应用程序。我们有一个由短交货预约组成的数据集。开始时间,持续时间,截止日期/时间等。我们的目的是创建一个应用程序,它将为一个工作块的开始和结束时间生成一个任务列表。
按以下顺序对作业进行优先排序:
当应用程序运行时,输入工作班次的开始和结束时间。该时间段按优先级顺序自动填充作业。
考虑:
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
,并将此数据输入调度程序。
从那里,我需要发生以下魔术:
遵循该逻辑,以下是数据填写计划的方式。
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存储桶阵列并填充约会?每当我安排一个事件并通过调度程序传递另一个事件时,我是否以某种方式将newStartTime
和newEndTime
传递回顶部?事件是否记忆在内存中?或者在填充特定插槽时写入数据库? Java中是否有预先定义的类已经完成了这个并且我错过了它?天哪......这会让人感到尴尬......
我现在太接近这一点了,我很难想象出一个好的策略。任何建议,观察和广义伪代码都会有所帮助。
答案 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中,以便始终对它们进行排序。这样可以更轻松,更有效地在尝试安排新工作时找到最佳拟合间隔。