Boa tarde, estou com problema que ta me deixando louco kkkkkk
É o seguinte, estou fazendo um sistema de Reserva, onde tem os campos data, horaInicio e horaFim, problema está na logica de não repetir naquele suposto dia. Entenderam ? Alguém teria uma ideia de como fazer ?
não pode ter reserva naquele data e hora
Montei uma ideia aqui:
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
public class Main {
private static final DateTimeFormatter PATTERN_DATA = DateTimeFormatter.ofPattern("dd/MM/yyyy");
private static final List<Reserva> RESERVAS = new ArrayList<>();
public static void main(String[] args) throws Exception {
criarReserva("15/10/2021", "13:00", "14:00");
criarReserva("15/10/2021", "14:00", "15:00");
criarReserva("15/10/2021", "14:59", "16:00");
System.out.println("Foram feitas " + RESERVAS.size() + " reservas.");
}
private static void criarReserva(String dia, String horaInicio, String horaFim) throws Exception {
var reserva = new Reserva(LocalDate.parse(dia, PATTERN_DATA), LocalTime.parse(horaInicio), LocalTime.parse(horaFim));
if (RESERVAS.isEmpty()) {
RESERVAS.add(reserva);
} else {
for (Reserva r : RESERVAS) {
if (r.seHaConflito(reserva)) {
throw new Exception("Não foi possível registrar a reserva " + reserva + ", pois conflitou com a reserva: " + r);
}
}
RESERVAS.add(reserva);
}
}
static class Reserva {
private final LocalDateTime inicio;
private final LocalDateTime fim;
public Reserva(LocalDate inicio, LocalTime horaInicio, LocalTime horaFim) {
this.inicio = inicio.atTime(horaInicio);
this.fim = inicio.atTime(horaFim);
}
public boolean seHaConflito(Reserva reserva) {
return
(seIgualOuDepois(reserva.inicio, inicio) && reserva.inicio.isBefore(fim)) ||
(seIgualOuDepois(reserva.fim, inicio) && reserva.fim.isBefore(fim));
}
private boolean seIgualOuDepois(LocalDateTime d1, LocalDateTime d2) {
return d1.equals(d2) || d1.isAfter(d2);
}
public LocalDateTime getInicio() {
return inicio;
}
public LocalDateTime getFim() {
return fim;
}
@Override
public String toString() {
return "Reserva [" + inicio.toLocalDate().format(PATTERN_DATA) + " (" + inicio.toLocalTime() + " - " + fim.toLocalTime() + ")]";
}
}
}
Com certeza deve dá para melhorar o código, e talvez tenha alguma falha.
1 curtida
valeu amigo, já posso tirar uma ideia de como fazer no meu sistema web, irei tentar aplicar essa ideia.