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?
Możesz po prostu dodać pole typu Boolean, np. Boolean czyWypozyczony. Podczas wypozyczania ustawiac je na true;
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.
a w jaki sposób zapisujesz wypożyczenia samochodu?
Klasa rezerwacja, w której są atrybuty takie jak pojazd, data startu, data końca
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.
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
}
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;
}
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.
Polecam com.google.common.collect.Range
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ę.