Java terminarz/rezerwacje

0

Cześć,
Mam mały problem. Otóż muszę przygotować program obsługujący rezerwację stolików w restauracji i niestety utknąłem na dość istotnym punkcie.
Zadanie wygląda następująco (jest to zobrazowanie problemu, a niekoniecznie treść zadania, które mam do wykonania, chodzi mi raczej o naprowadzenie, chociaż gotowe rozwiązanie też byłoby super :)):
Restauracja czynna od wtorku do niedzieli (10:00-20:00) posiada 10 stolików, które można zarezerwować. Klient po wybraniu konkretnego stolika (nr od 1 do 10) dostaje informację zwrotną z 3 najbliższymi terminami w których dany stolik jest dostępny. Stolik można zarezerwować na 1h.
Zaznaczę, że dla ułatwienia program nie wymaga komunikacji z użytkownikiem (klasa scanner nie jest potrzebna, wszystkie dane wprowadzane będą w kodzie).
Mój problem polega na tym, że nie mam zielonego pojęcia jak ten problem ugryźć, od czego zacząć, czego użyć.

2
  1. Potrzebujemy w jakiś sposób trzymać informacje o zajętości stolików. Oczywiście każdy stolik ma swoją listę rezerwacji.
  2. Potrzebujemy w jakiś sposób generować te trzy sloty.

No i w sumie tyle.

  1. Jak wiadomo w Javie wszystko da się załatwić HashMapą. HashMapa, żeby powiązać nr stolika ze rezerwacjami, a Set ponieważ każdy stolik może mieć tylko jedną godzinę na raz.
Map<Integer, Set<LocalDateTime>> tables = new HashMap<>();
  1. Trzeba to jakoś generować. No to napiszmy sobie funkcję, która wypluje nam najbliższą godzinę z przedziału, który napisałeś ale od daty którą jej przekażemy. Na ten moment ignorujemy w ogóle stoliki. Chcemy tylko, żeby funkcja nam zwróciła:
    Input: Niedziela 15:00 Output: najbliższy wtorek 10:00
    Input: Wtorek 15:00 Output: Wtorek 16:00
    Input: Wtorek 20:30 Output: Sroda 10:00
    Na ten moment załóżmy, że można rezerwować tylko na pełne godziny ;)
private static LocalDateTime getNextFreeSlot(LocalDateTime sinceWhen) {
    // tutaj Twój kodzik
}
  1. Ekstra, no to jak już to mamy, to teraz niech ta nasza funkcja przyjmuje już zarezerwowane godziny i spróbuje w oparciu o to wypluć następny termin.
Set<LocalDateTime> reservations = new TreeSet<>();
// jutro od 10 do 12 zajęte
reservations.add(LocalDateTime.parse("2018-11-24T10:00:00"));
reservations.add(LocalDateTime.parse("2018-11-24T11:00:00"));
reservations.add(LocalDateTime.parse("2018-11-24T12:00:00"));
// ... gdzieś tam kapkę niżej
private static LocalDateTime getNextFreeSlot(LocalDateTime sinceWhen, Set<LocalDateTime> takenSlots) {
    // teraz robisz to samo co już wcześniej było, ale DOPÓKI wygenerowanej daty nie ma w taken Slots. Oczywiście
    // zaczynasz od najbliższego możliwego terminu (po to był punkt 2) Może jakaś rekurencja? hmmm... 
}
  1. Dobra, to teraz mamy już funkcję, która nam generuje sloty i respektuje te zajęte. To teraz trzeba ją wywołać trzy razy? A może ją zmodyfikujemy tak:
private static Set<LocalDateTime> getNextFreeSlots(LocalDateTime sinceWhen, Set<LocalDateTime> takenSlots, int freeSlotsCount) {
    Set<LocalDateTime> freeSlots = new TreeSet<>();
    // teraz robisz to samo co już wcześniej tylko jak znajdziesz wolny slot, to jeszcze szukasz freeSlotsCount - 1 slotów. i tak aż wszystkie znajdziesz
    // i wpychasz je do Setu wynikowego
    return freeSlots;
}
  1. Okej wszystko na razie idzie gładko. Najtrudniejsze za nami. Teraz wystarczy wybrać jeden z tych trzech slotów, które zwróciła nasza metoda i domontować je do naszej mapy z punktu pierwszego tables pod kluczem od 1 - 10 w zależności dla jakiego stolika szukaliśmy slotu.

Wydaje się skomplikowane, ale małymi kroczkami i dasz radę. Staraj się pisać wszystko najprościej jak się da, nawet na ifach. Wtedy łatwiej zauważysz różne powtarzalne rzeczy i będzie można to zwijać w pętle itd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1