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

标签 java calendar

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center寻求指导。




9年前关闭。




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

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

  • 今天在特定时间到期
  • 今天截止日期不详
  • future 日期到期,按升序排序
  • 没有截止日期
  • future 开始日期(不包括在报告中)

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

    考虑:
    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 分钟的存储桶数组,并在我遍历我的任务列表时用约会填充这些存储桶?我是否以某种方式通过了 newStartTimenewEndTime每次我安排一个事件并通过调度程序传递另一个事件时回到顶部?事件是在内存中举行的吗?或在填充特定插槽时写入数据库? 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/

    相关文章:

    java - Web.xml 异常类型

    java - 流口水时比较工作内存中的对象(事实)

    java - java中如何在数组末尾插入一个元素?这是我的代码,显示 ArrayindexBoundOfException

    java - 如何获取总周数和天数

    javascript - 如何禁用 YUI3 Calendar minimumDate 之前的日期?

    java - 如何使用java日历获取该月的第一天?

    android - 为什么 CalendarProvider 不允许写 ExtendedProperties?

    java - JAX-RS 中的@Produces 注解

    android - 使用 Intent 将事件插入日历时出错

    java - 当不满足条件时,while 循环不会中断