2015-05-19 31 views
-1

我正在嘗試創建一個簡單的預約系統來練習TDD。我最初嘗試了一個ArrayList,其中有一些代表時間的空格,然後是一個Map,兩者似乎都很接近,但最終都沒有奏效。 Immutibilty是關鍵,我用了一個構造函數來設置的能力,想有二傳手依賴於字符串值的空字符串岬或nullabilty(試用過):java中簡單預訂系統的最佳數據類型

public class BookingSystem { 

    private BookingSystem bookingSystem; 
    private Map<Integer, String> classList; 

    public HashMap<Integer, String> setClassList() { 
     for (int i=0;i<24; i++) { 
      classList.put(0, ""); 
     } 
     return classList; 
    } 

    public void bookClassroom(int time, String room) throws BookedException { 
     if (classList.get(time).equals("")) { 
      classList.put(time, room); 
     } else { 
       throw new BookedException(); 
     } 
    } 

這似乎像黑客,但對我來說似乎也是合乎邏輯的。是一個HashMap矯枉過正,並會簡單的列表或數組足夠?我已經嘗試過所有這些,但沒有完全實現它,現在我覺得現在我已經陷入了許多Java數據結構中。

下一步就是讓教室成爲自己的班級和一個枚舉,但首先我必須弄清楚基礎知識!

  • 編輯:插在防火牆後面,不允許我評論他人的帖子。數組/列表/地圖的每個索引應該足夠「一小時」。該名單將長8或24個指數(沒關係,因此表現不成問題)。
+0

太多的辯論,人...我相信會有一個不同的和獨特的設計,爲eqch我們之一的應用創意... – eduyayo

回答

0

那麼,這取決於預訂。如果預訂位置較小(預約單位爲一小時,學校開放時間爲上午9點至下午5點),則可以將每個小時作爲地圖結構中的關鍵字。但是,如果您的預訂應用程序使用了一天以上,則必須將日期(ddmmyyyy)與地圖(Map>)關聯。

如果預訂時間很複雜(可以從8點20分到11點10分),那麼您需要一個預訂實體,其中包含預訂開始日期,預訂結束日期和教室字段。然後,您將在與預訂數據庫交互的方法中實施預訂邏輯。該方法將檢查是否存在與我們想要創建的預訂相沖突的預訂。如果是這種情況,該方法引發一個例外;否則會創建一個新預訂。

爲了更好地理解要使用哪個Java結構,您必須知道每個結構的特性。有一個簡單的總結here

0

「不變性」約束使得Hashmap/table顯着難以實現,因爲您的表會變得非常臃腫。

散列表中的運行時間是O(1)攤銷。但是,哈希表會變得太密集,導致O(N)的運行時間。我認爲重新散列使得這種情況非常罕見,並且將運行時間減少到O(1)。

如果您正在實現ArrayList,則運行時爲O(N)最差情況。但是,如果您知道元素的確切位置,則爲O(1)運行時。總的來說,隨着預訂數量的增加,使用ArrayList時,您將有更高的搜索/插入/刪除平均運行時間。

爲了提供最高的效率,每當當前的ArrayList填充時,必須增加n/2個元素的結構。這一開始看起來可能並不糟糕,但是當您有大量可能的預訂時會發生什麼?您的資源受到嚴重限制。


就個人而言,我會嘗試實施AVL-Tree。這遵循二進制搜索樹屬性,這將保持您的預訂時間順序,並同時保持您的樹平衡(節省空間和搜索/插入/刪除運行時)。

AVL-Tree爲您提供了O(log N)用於搜索插入和刪除的運行時間以及O(N)的最壞情況空間。隨着預訂數量的增長,AVL-Tree的性能將顯着優於ArrayList的Hashmap /表。