Алгоритм поиска билета для автобусов

103
05 февраля 2021, 12:00

Пишу приложение для поиска и продажи билетов на автобусы. Но столкнулся с трудностью составления алгоритма поиска билетов. Буду рад любому совету и помощи, или ссылке.

Задача такова: у нас есть расписание, которое состоит из рейсов. Рейс создаётся как ежедневный или по числам или дням недели. Рейсы по одному маршруту, но в разное время отправления считаются разными рейсами(например, рейс 111 в 8.00 и рейс 117 в 10.00).

Как организовать поиск билетов от станции А до станции Б, т.е. найти все рейсы идущие через эти станции, причём направление от А до Б, наоборот не подходит.

Обновление: Есть рейсы, которые состоят из:

  • номер рейса;
  • его маршрут от станции А до конечной станции Б;
  • тип рейса (ежедневный, по дням недели, по числам).

Каждый рейс содержит таблицу графика его движения по маршруту: время отправления и время прибытия на каждую станцию остановки, но это все без даты, т.к. рейс ходит например ежедневно. Есть рейсы обратные от станции Б до станции А, есть проходящие рейсы через станцию А и станцию Б.

Как можно организовать поиск билетов, а значит рейсов, которые идут, например 11.06 от станции А до станции Б, причём дата прибытия на станцию Б 12.06?

Answer 1

Пока не видно в чем проблема, тут скорее задача на аккуратность и усидчивость. Попробую расписать свое понимание процесса по шагам:

Задача: Определить все рейсы, которые отправляются из А в дату ДатаА и прибывают в Б в дату ДатаБ.

Шаг 0. У нас есть список всех рейсов.

Шаг 1. Выберем рейсы, которые проезжают через А.

Пробегаемся по всем рейсам, отсеиваем те, у которых в маршруте нету А.

Шаг 2. Из оставшихся, рейсы, которые проезжают через Б после А.

Отфильтровываем рейсы, у которых в маршруте после А нет Б.

Шаг 3. Из оставшихся, рейсы, которые проезжают через А в ДатаА.

Тут нужен некий метод, который умеет:

  • находить А в маршруте рейса;
  • находить диапазон времени, в который рейс должен отправиться со стартовой точки, чтобы прибыть в А в ДатаА;
  • проверить, отправляется ли рейс в этот диапазон, используя тип рейса (ежедневный наверняка может всегда, для еженедельного потребуется проверка).

Если тут может быть несколько дат отправления для одного рейса, то имеет смысл разбить рейсы на сущности КонкретныйРейс (Рейс, ДатаОтправления).

Шаг 4. Из оставшихся, рейсы, которые прибывают в Б в ДатаБ.

Для каждого из рейсов вычисляем дату прибытия в Б. Те, по которым дата не сойдется с ДатаБ отбрасываем.

Для этого шага будет удобно если КонкретныйРейс будет уметь рассчитывать время прибытия на заданную станцию в своем маршруте.

Это общий подход, который можно реализовать по шагам и проверять после каждого шага. После того как реализация будет хорошо проверена на корректность можно будет подумать о скорости выполнения. Если рейсы будут хранится в БД, то часть шагов (если не все) можно будет выполнить запросами.

READ ALSO
AuthenticationManager не связывается

AuthenticationManager не связывается

Есть вот такой вот сервисЭти 2 штуки не "автоварятся"

136
Как развернуть веб приложение?

Как развернуть веб приложение?

Написал я свое первое веб приложение (писал на Spring Boot)Запускаю на localhost - все работает как надо

114
Вынести переменные в метод

Вынести переменные в метод

Подскажите как в даном примере

112