Pokrywające się okresy czasu

Pokrywające się okresy czasu
P6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
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?

MO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 90
0

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

P6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
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.

MO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 90
0

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

P6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

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

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
1

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

Kopiuj
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.

MO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 90
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
}

krancki
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: 74.7261832, -41.7409518
  • Postów: 151
1

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

Kopiuj
static boolean checkDate(Pojazd pojazd, Data Od, Data Do)
{
if( Od<=pojazd.getdataKonca()  && pojazd.getDataStartu()<=Do ) 
{
return true;
}
return false;
}
CS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 296
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.

D9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 54
1

Polecam com.google.common.collect.Range

Aleksander Brzozowski
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 26
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ę.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.