Pokrywające się okresy czasu

0

Pracuję nad moim pierwszym większym projektem pt. wypożyczalnia samochodów i natrafiłem na jeden problem. Mianowicie chcę stworzyć metodę, która sprawdza, czy samochód jest wolny w danym okresie. Argumentami metody miałyby być data początku i data końca planowanego wynajmu. W klasie rezerwacja (posiada m.in. atrybuty takie jak pojazd, data startu, data końca) byłoby to porównywane w pętli. Próbowałem rozwiązać ten problem if-ami, ale nie wydaje mi się to profesjonalne. Szukałem trochę w dokumentacji, ale też nie znalazłem gotowej metody, która by mnie ratowała. Czy ktoś jest w stanie zaproponować jakieś rozwiązanie lub podpowiedzieć jak wy rozwiązujecie tego typu problemy?

0

Możesz po prostu dodać pole typu Boolean, np. Boolean czyWypozyczony. Podczas wypozyczania ustawiac je na true;

0

wtedy będę sprawdzał czy jest wypożyczony w danym momencie. Chodzi o to, że np. dzisiaj chciałbym sprawdzić czy pojazd będzie wolny np. 15.09-20.09.

0

a w jaki sposób zapisujesz wypożyczenia samochodu?

0

Klasa rezerwacja, w której są atrybuty takie jak pojazd, data startu, data końca

1

w dwóch porównaniach to daje się zrobić sprawdzenie, czy przedziały (from,to) mają część wspólną.

this.from <= other.to && other.from <= this.to

To jest (dla mnie) nieco w klimacie paradoksów, proste żołnierskie myślenie podpowiada, że trzeba cztery porównania. Też macie podobne intuicyjne podejście? Czasem wyobraźnia zawodzi ....
EDIT. Do tych zawodzących intuicji należy też sprawdzanie każdego pojedynczego dnia w okresie.

W każdym razie, takie wyrażenie w pętli dla każdego Wypożyczenia, lub dla każdego Samochodu, zależnie z jakiej perspektywy szukamy.

0

public Boolean sprawdzCzyWolne(Date dataStartu,Date dataKonca, Date sprawdzData ){
// sprawdzic ile dni mija miedzy data startu a data konca wypozyczenia

// tutaj wstawic petle for ktora bedzie miala tyle powtorzen ile dni miedzy startem a koncem wlacznie

// w petli porownac sprawdzData z tymi dniami pomiedzy
// jesli jest rowne to dac false

// jesi nie to true
}

1

Metoda statyczna z parametrami Pojazd, data od(Planowany) , date do(Planowany) pobierasz data Startu i date Stopu z obiektu Pojazd.

static boolean checkDate(Pojazd pojazd, Data Od, Data Do)
{
if( Od<=pojazd.getdataKonca()  && pojazd.getDataStartu()<=Do ) 
{
return true;
}
return false;
}
0

Nie wiem, czy to profesjonalne rozwiązanie, ale można każdemu pojazdowi przydzielić tablicę typu lookup dla rezerwacji, jedna komórka to jeden dzień, indeks to numer dnia np. roku, wtedy rezerwacja na 4 stycznia to lookup[4]=true, sprawdzenie czy jest wolny w dniu 6 stycznia to odczyt z lookup[6] itd. Problemem jest tylko wyciągnięcie wszystkich wolnych terminów, bo trzeba przeglądać całą tablicę. Aby było jeszcze bardzie "pro", z tablicy robisz bufor cykliczny, indeksy obliczasz względem bieżącego dnia i każdego dnia możesz rezerwować zawsze N dni.

1

Polecam com.google.common.collect.Range

0

Z tego co pamiętam to LocalDate implementuje interfejs Comperable, a dodatkowo powinny być w samej klasie jeszcze metody isAfter i isBefore, które przyjmują również datę.

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