2014-11-20 59 views
0

我需要存儲的餐桌預約時隙,然後看看是否有任何碰撞......代表和比較時隙

For example - Total tables - 4 
1) 9 - 11 , 3 tables 
2) 9 - 10 , 1 tables (Need to do search if any table left 
         with constraint to above booking) 

如何存放的時隙和表和與別人比較。 ..

我應該使用什麼樣的數據結構...

如果我使用的HashMap什麼可以的關鍵和價值,

我設計的所有其他類和依據方法b UT不能能夠找到一種方法來解決時隙衝突問題

collision example - 

total - 4 tables 

1) 9-10 , 3 tables 

2) 9-11 , 1 table 

3) 9-12 , 2 tables (collision , table not available) 
+0

你能舉一個碰撞的例子嗎? – jrad 2014-11-20 18:04:12

+1

我不太清楚你打算如何比較表格? 9-11中的所有3個表都一樣嗎?或者它們是獨特的。爲什麼不創建一個自定義預訂類型,並創建一個基於時隙的鏈接HashMap作爲您的密鑰?然後在每個插槽中使用鏈接列表來添加可用表的列表? – sreisman 2014-11-20 18:04:47

+0

@sreisman是的我沒有得到任何線索如何比較插槽,而不是表格,每個插槽將有表關聯,3表是不同的表中四個總表保留從上午9點到晚上11點,請你舉例使用哈希映射chaning查找碰撞以及如何在任何時候獲得空閒表的列表 – anshulkatta 2014-11-20 18:08:21

回答

2

你可以簡化問題,通過切片可用時間在15分鐘(或任何其他塊的大小是適合你)塊。對於餐廳預訂,我敢打賭,15分鐘的街區還行。

然後你可以有一個簡單的int []來存儲每個時間段的預訂表的數量。

例如: 您的餐廳從早上9點到晚上9點開放,所以12小時,每個時段有4個時段。所以你需要一個具有48個插槽的int []。現在,當您從9點到11點預約3張桌子時,您將前8個時間段(意思是9點到11點)增加3點。第二次預約會將前4個時間段增加1.如果預訂會增加您的一個插槽超過可用的表限制,您知道您需要拒絕它。

final int MAX_TABLES = 4; 
final int OPENING= 9; 
final int CLOSING= 21; 
final int SLOTS= 4; 
int[] booking = new int[(CLOSING - OPENING) * SLOTS]; 

public void main() { 
    // no tables booked 
    Arrays.fill(booking,0); 

    doBooking(3, 0, 8); 
    doBooking(1, 4, 8); 
    doBooking(1, 4, 12); 
} 

public void doBooking(int tables, int startSlot, int endSlot) { 
    for (int slot= startSlot, slot < endSlot, slot++) { 
     if (booking[slot] + tables > MAX_TABLES) { 
      throw new Exception("no free table at slot "+slot); 
     } 
    } 
    for (int slot= startSlot, slot < endSlot, slot++) { 
     booking[slot] += tables; 
    } 
} 

這應該給你的想法。還有些事情要做,例如適當的異常處理,時間轉換等等。還要注意,這可能是不正確的java代碼,因爲我沒有測試它,也沒有在GUI中編寫它。

+0

您正在考慮這個想法...請詳細說明一些僞代碼...即時通訊 – anshulkatta 2014-11-20 18:17:49

+0

如果我想要一個1小時的時間段,然後讓我說在上午9點-12點,我會有int [] = {0,0,0} = {9 -10,10-11,11-12},並且在每次預訂中,我將每個0加上該時間段所需的表格.9-11 a [] = {3,3,0}爲3個表格.am我正確 – anshulkatta 2014-11-20 18:21:39

+1

而不是爲每個插槽存儲0,我將存儲每個插槽中可用的最大數量的表。然後,對於每個預留,您可以在預留的時間段內將每個值減1或減1。那麼如果你有0,你就知道那個槽裏的預留是不可能的。 – sreisman 2014-11-20 18:29:12

0

對於時間範圍(使其時間戳或15分鐘的間隔)使用Guava Range - 它有很好的工具來處理範圍(碰撞)。

從現在到未來以開放間隔開始 - 所有表格都可用。 新預訂 - >檢查整個間隔是否有空閒表。 如果打破原有間隔三 - > +這+後

重複...

+0

不能使用第三方api – anshulkatta 2014-11-20 18:14:19

0

您可以創建一個時隙的對象,並比較各前開始和endtimes。

public class TimeSlot { 

    private int startTime; 
    private int endTime; 


    public TimeSlot(int start, int end){ 
    this.startTime = start; 
    this.endTime = end; 


    } 



} 
+0

已經做了這個..創建了一套時間覆蓋比較方法,並比較方法 – anshulkatta 2014-11-20 18:22:44