就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center寻求指导。
9年前关闭。
我正在尝试创建日历和日程安排应用程序。我们有一个由短期交货预约组成的数据集。开始时间、持续时间、截止日期/时间等。我们的目的是创建一个应用程序,该应用程序将在给定工作 block 的开始和结束时间的情况下生成任务列表。
作业按以下顺序排列优先级:
当应用程序运行时,输入工作类次的开始和结束时间。该时间段会自动按优先级顺序填充作业。
考虑:
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
由于 future 的开始日期,将被排除在外。考虑一下:01 月 2 日,我来办公室工作了四个小时,
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
到目前为止,我的优先级逻辑工作得很好。我可以正确地将第一条记录捕获到时间表中。但是后来,我迷失在了alendaring 部分,尤其是如何保持某个时间段以便没有任何内容覆盖它,并且不超过开始和结束时间。我正在努力寻找一种有效的方法来构建填充日历的方法。我是否创建了一个 15 分钟的存储桶数组,并在我遍历我的任务列表时用约会填充这些存储桶?我是否以某种方式通过了
newStartTime
和 newEndTime
每次我安排一个事件并通过调度程序传递另一个事件时回到顶部?事件是在内存中举行的吗?或在填充特定插槽时写入数据库? Java中是否有一个预定义的类已经做到了这一点而我错过了它?天哪……那会很尴尬……我现在离这个太近了,并且无法想象一个好的策略。任何建议、观察和通用伪代码都会有所帮助。
最佳答案
观察/建议一:
我不清楚为什么你会希望一份工作覆盖另一份工作。如果您已经完成了优先级代码并且您首先添加了最高优先级的作业,为什么您需要覆盖时隙?我会创建一个结构,允许一个工作声明一个时间段,然后一旦声明其他工作就不能声明同一个时间段。
编写一个作业计划类来处理一天的作业。它可以只存储今天计划中的作业列表。然后可以即时计算可用时隙和占用时隙。如果您担心断电后数据仍然存在,那么您可以定期将对象的一些序列化写入磁盘。除非您希望此应用程序是多线程的,然后您可以将线程安全问题委托(delegate)给数据库,否则我并没有真正看到将这些数据存储在数据库中的值(value)。
我建议在 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{ /* */ }
}
观察二:
当您实现 assignJob 时,您应该能够只查找满足要求的第一个可用时间段。以这种方式进行会给你一个时间表,但可能不是最优化的时间表。如果存在无法安排所有作业的情况,您需要仔细定义最佳解决方案的外观。一个错过最少工作岗位的人?一个捕获今天到期的最多职位的职位?
建议:
我会让 Interval 实现 Comparable。首先按长度排序间隔,然后按开始时间。将间隔存储在 TreeSet 中,以便它们始终是有序的。这将使在尝试安排新工作时更容易和更有效地找到最佳拟合间隔。
关于java - 我需要帮助设计日历和日程安排应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14860143/