表示和比较时隙

时间:2014-11-20 17:57:35

标签: java algorithm

我需要存储餐厅餐桌预订的时间段,然后查看是否有任何碰撞......

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可以是关键和值,

我设计了所有其他类和方法,但无法找到解决时隙冲突问题的方法

collision example - 

total - 4 tables

1) 9-10 , 3 tables

2) 9-11 , 1 table

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

4 个答案:

答案 0 :(得分:2)

您可以通过将可用时间以15分钟(或任何其他适合您的块大小)的方式切片来简化问题。对于餐厅预订,我打赌15分钟的街区还可以。

然后你可以有一个简单的int []来存储每个时隙的预订表数。

实施例: 您的餐厅从上午9点到晚上9点开放,所以12个小时,每个时段有4个时段。所以你需要一个带有48个插槽的int []。现在,当您预订3个表格9到11点钟时,然后您将前8个插槽(表示9到11 o'时钟)增加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中编写它。

答案 1 :(得分:1)

更多示例:)
我遇到了同样的问题。
我使用接口Slot创建时隙并在应用程序中使用它
例如:

Schedule schedule = new Schedule(myduration, unit);
schedule.add(date1, slot1);
schedule.add(date2, slot2);

schedule.get(date1, slot1);
schedule.indexOf(date1, slot1);
schedule.remove(date1, slot1);
schedule.set(date1, index, slot1);

更多详细信息,请访问github https://github.com/illineya/schedule

答案 2 :(得分:0)

对于时间范围(使其为时间戳或间隔15分钟),使用Guava Range - 它有很好的工具来处理范围(碰撞)。

从现在到未来的开放时间间隔开始 - 所有表都可用。 新预订 - &gt;检查整个时间间隔是否有空闲表。 如果有原始间隔中断为三 - > <+ p>之后<+ p>

REPEAT ...

答案 3 :(得分:0)

您可以创建时间段对象并比较每个开始和结束时间。

public class TimeSlot {

    private int startTime;
    private int endTime;


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


    }



}