我有多个开始和结束的日期。这些日期可能如下所示:
d1: |----------|
d2: |------|
d3: |--------------|
d4: |----|
d5: |----|
Run Code Online (Sandbox Code Playgroud)
现在我需要检查重叠日期的最大计数。所以在这个例子中,我们得到最多 3 个重叠日期(d1、d2、d3)。考虑一下,可以有 0 到 n 个日期。
你能帮我完成这个任务吗?先感谢您。
更新
输入:带有开始和结束点的 Java 日期列表,例如 List,其中 MyCustomDate 包含开始和结束日期
输出:重叠日期(作为 MyCustomDate 的列表)
每个时间跨度包括一个带有小时和秒的 LocalDateTime 类型的开始和结束点。
我的回答会考虑:
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))并测试每个开始日期和结束日期。
| 归档时间: |
|
| 查看次数: |
336 次 |
| 最近记录: |