有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

  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;

2002年1月,这十项工作将按以下顺序排列:01-02-09-10-05-06。由于未来的开工日期,工作03-04-07-08将被排除在外

考虑一下:2002年1月1日,我到办公室轮班四个小时,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

到目前为止,我的优先级逻辑工作得很好。我能很好地把第一张唱片记录到日程表上。但是,我对这篇文章感到迷茫,尤其是如何保持某个时间段,这样就不会有任何内容覆盖它,并且不会超过开始和结束时间。我正在努力寻找一种有效的方法来构建填充日历的方法。我是否创建了一个包含1500万个bucket的数组,并在遍历任务列表时用约会填充这些bucket?每次我安排一个事件并通过调度程序传递另一个事件时,我是否会以某种方式将newStartTimenewEndTime传递回顶部?事件是否被保存在记忆中?或者在填充特定插槽时写入数据库?Java中是否有一个预定义的类已经实现了这一点,而我却错过了它?天哪。。。那会很尴尬

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


共 (1) 个答案

  1. # 1 楼答案

    观察/建议1: 我不明白你为什么希望一份工作比另一份工作写得多。如果您已经完成了优先级代码,并且首先添加了优先级最高的作业,那么为什么需要覆盖时间段?我会创建一个结构,允许一个工作申请一个时间段,然后一旦申请了其他工作就不能申请相同的时间段

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

    我建议在Job中添加一个字段:assignedStartTime

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

    然后在计划内,我们可以写以下内容:

    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时,您应该能够只查找满足要求的第一个可用时间段。这样做会给你一个时间表,但可能不是最理想的时间表。如果在某些情况下不能安排所有作业,则需要仔细定义最佳解决方案。错过最少工作机会的人?一个抓住了最多的工作机会,今天到期

    建议: 我会让你去的。先按长度排序,然后按开始时间排序。将间隔存储在树集合中,以便随时订购。这将使你在安排新工作时更容易、更有效地找到最合适的时间间隔