2013-02-13 135 views
0

我正在嘗試創建日曆和日程安排應用程序。我們有一個由短期交付約會組成的數據集。開始時間,持續時間,截止日期/時間等。我們的目的是創建一個應用程序,該應用程序將生成一個給定工作塊的開始和結束時間的任務列表。我需要幫助設計日曆和日程安排應用程序

職位按優先級順序如下:

  • 今天由於今天

    1. 由於在特定的時間,在沒有具體的時間
    2. 由於在未來某一日期,按升序排序
    3. 沒有截止日期
    4. 未來開始日期(不包括報告)

    當應用程序運行時,輸入工作班次的開始和結束時間。該時間塊按照優先順序自動填充作業。

    考慮:

    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. 一旦具有特定時間的所有作業都在日曆中,請繼續填寫以第一個emply插槽開始的約會,直到日曆填滿爲止,然後停止。

    此之後的邏輯,這裏的數據是如何填寫的時間表。

    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-miunt桶的陣列並填寫預約?每次我安排一個事件並通過調度器傳遞另一個事件時,我是否會以某種方式將newStartTimenewEndTime返回頂部?記憶中是否有事件?或寫入數據庫,因爲他們填充特定的插槽? Java中是否有預定義的類已經這樣做了,我錯過了它?天哪...這將是尷尬......

    我太接近這個,現在,我有麻煩形象化一個很好的策略。任何建議,意見和廣義僞代碼都會有所幫助。

  • +0

    你的問題似乎有一些哈希表碰撞的相似之處。你可以嘗試閱讀有序散列,並查看優先級顛倒的工作是否可行。 – 2013-02-13 18:14:57

    回答

    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你應該能夠只尋找符合要求的第一個可用時隙。以這種方式進行會給你一個時間表,但也許不是最優化的時間表。如果會出現並非所有工作都可以安排的情況,則需要仔細確定最佳解決方案的樣子。一個錯過了最少數量的工作?捕獲今日到期的工作數量最多的一個?

    意見建議: 我會有間隔實現可比。先按照長度,然後按開始時間對間隔進行排序。將間隔存儲在TreeSet中,以便始終訂購它們。這樣可以使試圖安排新工作時找到最佳擬合間隔變得更容易,更高效。

    +0

    RE:觀察1 ...我永遠不想要一個工作覆蓋。如果我只是在工作之後添加工作,那很簡單。我需要避免在30分鐘內完成SCHEDULED(優先級1)工作並且現在計劃60分鐘的工作的情況。我沒有看到如何確保該方法知道有一個約會的開始時間收縮覆蓋了移位收尾。 'TimeInterval類是一個優雅的解決方案,我現在看不到。謝謝! – dwwilson66 2013-02-13 19:49:30