JAVA получает весь период даты

У меня есть функция, которая охватывает весь период поездки, которая может включать в себя перелеты, поездки на автомобиле и расходы, такие как такси и т. Д., И все они имеют даты. Я хочу вернуть весь диапазон этих поездок, например, если у меня есть поездка с началом в 2017-01-02 и окончанием в 2017-01-10, а дата поездки на автомобиле Диапазон дат возврата 2017-02-01 должен быть следующим: 2017-01-02 и 2017-02-01.

public DateRange updateClaimDates(Claim claim) {
        DateRange dates = new DateRange();
        if (!claim.getFlights().isEmpty()) {
            List<Flight> sortedFlights = Lambda.sort(claim.getFlights(), Lambda.on(Flight.class).getStartDate());
            dates.setStartDate(sortedFlights.get(0).getStartDate());
            dates.setEndDate(sortedFlights.get(sortedFlights.size() - 1).getEndDate());
        } 
        if (!claim.getCarTrips().isEmpty()) {
            List<CarTrip> carTrips = Lambda.sort(claim.getCarTrips(), Lambda.on(CarTrip.class).getTripDate());
            dates.setStartDate(carTrips.get(0).getTripDate().before(dates.getStartDate()) ? carTrips.get(0).getTripDate() : dates.getStartDate());
            dates.setEndDate(carTrips.get(carTrips.size() - 1).getTripDate().after(dates.getEndDate()) ? carTrips.get(carTrips.size() - 1).getTripDate() : dates.getEndDate());
        } 
        if (!claim.getExpenses().isEmpty()) {
            List<Expense> sortedExpenses = Lambda.sort(claim.getExpenses(), Lambda.on(Expense.class).getDate());
            dates.setStartDate(sortedExpenses.get(0).getDate().before(dates.getStartDate()) ? sortedExpenses.get(0).getDate() : dates.getStartDate());
            dates.setEndDate(sortedExpenses.get(sortedExpenses.size() - 1).getDate().after(dates.getEndDate()) ? sortedExpenses.get(sortedExpenses.size() - 1).getDate() : dates.getEndDate());
        }

        return dates;
    }

Что было бы наиболее эффективным способом без трех операторов if и проверки этой даты после и до?


person Dadonis    schedule 22.03.2017    source источник


Ответы (1)


Вам не нужно сортировать списки, чтобы найти диапазон. Поиск только минимума/максимума намного эффективнее (O(n)) по сравнению с лучшим случаем сравнительной сортировки O(n*lg(n)) или худшим случаем O(n*n).

Сначала найдите три минимума, а затем найдите наименьший из этих трех. Затем найдите три максимума и получите наибольший из них.

Наконец, диапазон будет от наименьшего из трех минимумов до наибольшего из трех максимумов.

EDIT: поиск максимума и минимума одновременно с использованием минимального количества сравнений

Этот ответ объясняет, как найти min и max, используя минимальное количество сравнений, что еще больше улучшит ваше решение.

person ahoxha    schedule 22.03.2017