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ć.
- Potrzebujemy w jakiś sposób trzymać informacje o zajętości stolików. Oczywiście każdy stolik ma swoją listę rezerwacji.
- Potrzebujemy w jakiś sposób generować te trzy sloty.
No i w sumie tyle.
-
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<>();
-
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 }
-
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... }
-
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; }
-
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.