Consider below example , inputList has overlap date ranges
inputList.add(new DateRange(LocalDate.of(2023, 7, 1), LocalDate.of(2023, 7, 10)));
inputList.add(new DateRange(LocalDate.of(2023, 7, 5), LocalDate.of(2023, 7, 30)));
inputList.add(new DateRange(LocalDate.of(2023, 7, 10), LocalDate.of(2023, 7, 20)));
inputList.add(new DateRange(LocalDate.of(2023, 7, 15), LocalDate.of(2023, 7, 20)));
inputList.add(new DateRange(LocalDate.of(2023, 8, 1), LocalDate.of(2023, 8, 20)));
Need to merge all overlap period and keep remaining non overlap period in resultList
resultList(new DateRange(LocalDate.of(2023, 7, 1), LocalDate.of(2023, 7, 04)));
resultLis(new DateRange(LocalDate.of(2023, 7, 5), LocalDate.of(2023, 7, 09)));
resultLis(new DateRange(LocalDate.of(2023, 7, 10), LocalDate.of(2023, 7, 10)));
resultLis(new DateRange(LocalDate.of(2023, 7, 11), LocalDate.of(2023, 7, 14)));
resultLis(new DateRange(LocalDate.of(2023, 7, 15), LocalDate.of(2023, 7, 20)));
resultLis(new DateRange(LocalDate.of(2023, 7, 21), LocalDate.of(2023, 7, 30)));
resultLis(new DateRange(LocalDate.of(2023, 8, 1), LocalDate.of(2023, 8, 20)));
With below code after overlap periods not splitting
class DateRange {
LocalDate start;
LocalDate end;
public DateRange(LocalDate start, LocalDate end) {
this.start = start;
this.end = end;
}
@Override
public String toString() {
return "DateRange [start=" + start + ", end=" + end + "]";
}
}
public class Main1 {
public static void main(String[] args) {
List<DateRange> inputList = new ArrayList<>();
inputList.add(new DateRange(LocalDate.of(2023, 7, 1), LocalDate.of(2023, 7, 10)));
inputList.add(new DateRange(LocalDate.of(2023, 7, 5), LocalDate.of(2023, 7, 30)));
inputList.add(new DateRange(LocalDate.of(2023, 7, 10), LocalDate.of(2023, 7, 20)));
inputList.add(new DateRange(LocalDate.of(2023, 7, 15), LocalDate.of(2023, 7, 20)));
inputList.add(new DateRange(LocalDate.of(2023, 8, 1), LocalDate.of(2023, 8, 20)));
List<DateRange> resultList = processDateRanges(inputList);
resultList.forEach(System.out::println);
}
public static List<DateRange> processDateRanges(List<DateRange> inputList) {
List<DateRange> result = new ArrayList<>();
Collections.sort(inputList, Comparator.comparing(r -> r.start));
for (int i = 0; i < inputList.size(); i++) {
DateRange current = inputList.get(i);
LocalDate start = current.start;
LocalDate end = current.end;
for (int j = i + 1; j < inputList.size(); j++) {
DateRange next = inputList.get(j);
if (next.start.isAfter(end.plusDays(1))) break;
if (next.start.isAfter(start)) {
result.add(new DateRange(start, next.start.minusDays(1)));
}
if (next.end.isBefore(end)) {
result.add(new DateRange(next.start, next.end));
start = next.end.plusDays(1);
} else {
start = next.start;
end = next.end;
}
}
result.add(new DateRange(start, end));
while (i + 1 < inputList.size() && inputList.get(i + 1).start.isBefore(end.plusDays(1))) {
i++;
}
}
return result;
}
}
Getting output as
- 2023-07-01 - 2023-07-04
- 2023-07-05 - 2023-07-09
- 2023-07-10 - 2023-07-20
- 2023-07-15 - 2023-07-20
- 2023-07-21 - 2023-07-30
- 2023-08-01 - 2023-08-20
Expecting as below
- 2023-07-01 - 2023-07-04 - Before overlap period of 1st record
- 2023-07-05 - 2023-07-09 - overlap with 1st and 2nd record
- 2023-07-10 - 2023-07-10 - overlap with 1st, 2nd and 3rd record
- 2023-07-11 - 2023-07-14 - overlap with 2nd and 3rd record
- 2023-07-15 - 2023-07-20 - overlap with 2nd , 3rd and 4th record
- 2023-07-21 - 2023-07-30 - after overlap period of 2nd record
- 2023-08-01 - 2023-08-20 - Non overlap period