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ć.
0
2
- 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.