Java terminarz/rezerwacje

Odpowiedz Nowy wątek
2018-11-23 11:19
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ć.

Masz już cokolwiek napisane? Jeśli tak to pokaż co takiego. - eL 2018-11-23 11:49

Pozostało 580 znaków

2018-11-23 11:49
0

https://stackoverflow.com/que[...]ervation-allocation-algorithm


Jeśli koleś pisze że nie używa Scannerów żeby było łatwiej i wszystko hard koduje to nie bardzo widzę jak miałby sobie poradzić z pomysłami z linka ;) - eL 2018-11-23 11:57
Przeczytałem 3/4 podlinkowanego artykułu i uważam, że jest napisany prosto i daje to o co mu chodzi - ideę jak to napisać. - lion137 2018-11-23 12:00

Pozostało 580 znaków

2018-11-23 22:40
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<>();
  2. 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
    }
  3. 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... 
    }
  4. 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;
    }
  5. 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.

edytowany 5x, ostatnio: Desu, 2018-11-23 22:47

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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