У меня есть класс Task, который выглядит следующим образом (с использованием Java 8 Time API).Сочетание диапазонов дат перекрытия - Java
class Task {
LocalDateTime start;
LocalDateTime end;
Set<String> actionItems;
}
Я два отсортирован (сначала начала, а затем к концу) списки, содержащие такие экземпляры задач, позволяет говорить List<Task> tasksList1
и List<Task> tasksList2
. Я хочу объединить перекрывающиеся задачи (путем разбиения задач, если это необходимо, и добавления элементов action из других задач, которые перекрываются в один новый объект задачи).
Например, предположим, что у меня есть задание T1, которое начинается с 01/01/2015 и заканчивается 01/31/2015, которое содержит элементы A и B. Действия пользователя. Затем пользователь создает новую задачу T2, которая начинается с 01/15/2015 и заканчивается 02/15/2015 и добавляет в него элемент действия C. Когда я объединяюсь, я должен получить три объекта Task следующим образом.
- Задача Х - от 01/01/2015 до 01/15/2015, содержит элементы действий A, B
- Задача Y - от 01/15/2015 до 01/31/2015, содержит элементы A , B и C
- задача Z - от 01/31/2015 до 02/15/2015, содержат пункт с
для визуализации, если мой объект задачи из двух списков выглядит следующим образом в сроках :
> [-----] [-----] [----] [-----------------]
> [-----] [---------------] [------]
Затем результирующий список задач будет содержать задачи следующим образом.
> [--][-][--] [-----] [-----][----][--] [-][------][-----]`
Перекрытие задачи должны иметь actionItems в сочетании с обеих задач, которые перекрывают друг друга на период, в котором они перекрывают друг друга.
Каков наиболее эффективный способ справиться с этим? На данный момент я тестирую различные варианты с помощью PeekableIterator, но пока не повезло. Любые решения, использующие JodaTime вместо API Java 8, также приветствуются.
Спасибо Тагир! Вы рок :) Извините, я не был ясно в своем вопросе, что время тоже важно для меня. Для простоты в этом примере я оставил это. Я считаю, что решение должно работать и для LocalDateTime? Еще одна вещь, которую следует отметить, заключается в том, что результат вашего алгоритма несколько отличается от того, что я ожидаю.Как слушайте в трех точках, я ожидаю, что три Задачи будут выводиться сначала с 01/01 по 01/15 с A, B, с 01/15 до 01/31 с A, B, C и третьим с 01/31 до 02/15 с C. На выходе не будет перекрытий. Я пытаюсь изменить ваше решение, чтобы справиться с этим ... –
@YohanLiyanage, да, для 'LocalDateTime' он будет работать одинаково, просто замените имя класса везде. Я добавил в примере использования одну непрозрачную задачу (2014 года), чтобы проверить, правильно ли она обрабатывается. Удалите его, и выход будет таким же. –
О, я пропустил, что это был 2014 год :). Еще раз спасибо, и это работает как шарм –