public static List<TimeSlot> mergeTimeSlots(List<TimeSlot> timeSlots) {
// 如果只剩一个时间段直接返回
if (timeSlots.size() == 1) {
return timeSlots;
}
for (int i = 0; i < timeSlots.size(); i++) {
for (int j = i + 1; j < timeSlots.size(); j++) {
TimeSlot timeSlot1 = timeSlots.get(i);
TimeSlot timeSlot2 = timeSlots.get(j);
List<TimeSlot> mergeSlot = mergeTwo(timeSlot1, timeSlot2);
// 如果两个时间段能合并则递归继续合并
if (mergeSlot.size() == 1) {
timeSlots.remove(timeSlot1);
timeSlots.remove(timeSlot2);
timeSlots.addAll(mergeSlot);
mergeTimeSlots(timeSlots);
}
}
}
return timeSlots;
}
private static List<TimeSlot> mergeTwo(TimeSlot timeSlot1, TimeSlot timeSlot2) {
List<TimeSlot> result = new ArrayList<>();
Date start1 = timeSlot1.getStartDate();
Date start2 = timeSlot2.getStartDate();
Date end1 = timeSlot1.getEndDate();
Date end2 = timeSlot2.getEndDate();
// 如果两个时间段完全没有交集则直接返回
if (end1.before(start2) || start1.after(end2)) {
result.add(timeSlot1);
result.add(timeSlot2);
}
// 如果有完全包含则去掉小的那个
else if (!start1.after(start2) && !end1.before(end2)) {
result.add(timeSlot1);
} else if (!start2.after(start1) && !end2.before(end1)) {
result.add(timeSlot2);
}
// 有交集则合并
else if (start1.before(start2) && end1.before(end2)) {
timeSlot1.setEndDate(end2);
result.add(timeSlot1);
} else if (start2.before(start1) && end2.before(end1)) {
timeSlot2.setEndDate(end1);
result.add(timeSlot2);
}
return result;
}
private static class TimeSlot {
private Date startDate;
private Date endDate;
public TimeSlot(Date startDate, Date endDate) {
this.startDate = startDate;
this.endDate = endDate;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
}