检查日期是否重叠并返回最大计数

Mar*_*öll 5 java compare date

我有多个开始和结束的日期。这些日期可能如下所示:

d1:      |----------|
d2:            |------|
d3:        |--------------|
d4:                         |----|
d5:   |----|
Run Code Online (Sandbox Code Playgroud)

现在我需要检查重叠日期的最大计数。所以在这个例子中,我们得到最多 3 个重叠日期(d1、d2、d3)。考虑一下,可以有 0 到 n 个日期。

你能帮我完成这个任务吗?先感谢您。

更新

输入:带有开始和结束点的 Java 日期列表,例如 List,其中 MyCustomDate 包含开始和结束日期

输出:重叠日期(作为 MyCustomDate 的列表)

每个时间跨度包括一个带有小时和秒的 LocalDateTime 类型的开始和结束点。

IQb*_*rod 4

我的回答会考虑:

  • 给定 (d3, d5) 不重叠=>重叠(d1,d3,d5) = 2,因为在给定时间只有两个日期会重叠。
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

class Event {
    LocalDate startDate; // inclusive
    LocalDate endDate; // inclusive

    Event(LocalDate st, LocalDate end) {
        this.startDate = st;
        this.endDate = end;
    }

    // Getters & Setters omitted
}

public class Main {
    public static void main(String[] args) {
        List<Event> events = new ArrayList<Event>();
        events.add(new Event(LocalDate.of(2019,1,1), LocalDate.of(2019,5,1))); // d1
        events.add(new Event(LocalDate.of(2019,3,1), LocalDate.of(2019,6,1))); // d2
        events.add(new Event(LocalDate.of(2019,2,1), LocalDate.of(2019,7,1))); // d3
        events.add(new Event(LocalDate.of(2019,8,1), LocalDate.of(2019,12,1))); // d4
        // d5 do not overlap d3
        events.add(new Event(LocalDate.of(2018,12,1), LocalDate.of(2019,1,31))); // d5

        Integer startDateOverlaps = events.stream().map(Event::getStartDate).mapToInt(date -> overlap(date, events)).max().orElse(0);
        Integer endDateOverlaps = events.stream().map(Event::getEndDate).mapToInt(date -> overlap(date, events)).max().orElse(0);

        System.out.println(Integer.max(startDateOverlaps, endDateOverlaps));
    }

    public static Integer overlap(LocalDate date, List<Event> events) {
        return events.stream().mapToInt(event -> (! (date.isBefore(event.startDate) || date.isAfter(event.endDate))) ? 1 : 0).sum();
    }
}
Run Code Online (Sandbox Code Playgroud)

我们对每个重叠日期进行求和(即使是其本身,否则 (d1, d2, d3) 只会对 d1 检查计算 (d2, d3))并测试每个开始日期和结束日期。