大佬教程收集整理的这篇文章主要介绍了Java合并重叠日期间隔,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
通常这种类型的算法是使用 sql(间隙和孤岛)完成的,但我需要找到一种方法在 Java 中完成。
我有一组对象:Set<UnavailableBlock>
UnavailableBlock
类如下(简化):
@Getter
@Setter
@AllArgsConstructor
@ToString
public class UnavailableBlock{
OffsetdatetiR_208_11845@e blockStartTime;
OffsetdatetiR_208_11845@e blockEndTime;
}
允许重叠间隔,所以我试图返回一个 Set<UnavailableBlock>
但合并的间隔在两者之间留下各自的间隙。我正在使用 OffsetdatetiR_208_11845@e 并且需要考虑时间。
例如(使用 Outlook):
private Set<AppointmentAvailabilityBlock> mergeUnavailabilitIEsBlocks(
Set<AppointmentAvailabilityBlock> appointmentComponentUnavailabilitIEsBlock) {
// transform Set to List
List<AppointmentAvailabilityBlock> intervals = new linkedList<AppointmentAvailabilityBlock>();
intervals.addAll(appointmentComponentUnavailabilitIEsBlock);
// Sort by blockStartTime
intervals.sort(Comparator.comparing(AppointmentAvailabilityBlock::getBlockStartTimE));
// Merge
linkedList<AppointmentAvailabilityBlock> merged = new linkedList<>();
for (AppointmentAvailabilityBlock interval : intervals) {
// No overlap with the prevIoUs interval,append it.
if (merged.isEmpty() || merged.getLast().getBlockEndTime().isBefore(interval.getBlockStartTime())) {
merged.add(interval);
} else { // There is overlap
OffsetdatetiR_208_11845@e maxOffsetdatetiR_208_11845@e = merged.getLast().getBlockEndTime().isAfter(
interval.getBlockEndTime()) ? merged.getLast().getBlockEndTime() : interval.getBlockEndTime();
merged.getLast().setBlockEndTime(maxOffsetdatetiR_208_11845@E);
}
}
return new HashSet<AppointmentAvailabilityBlock>(merged);
}
问题是我不断收到重叠的块:
橙色 = 合并前
绿色 = 合并后
注意:我正在使用带有 lombok 注释的 Spring Boot
private Set<AppointmentAvailabilityBlock> mergeUnavailabilitiesBlocks(
Set<AppointmentAvailabilityBlock> appointmentComponentUnavailabilitiesBlock) {
// Transform Set to List
List<AppointmentAvailabilityBlock> intervals = new LinkedList<AppointmentAvailabilityBlock>();
intervals.addAll(appointmentComponentUnavailabilitiesBlock);
// Sort by blockStartTime
intervals.sort(Comparator.comparing(AppointmentAvailabilityBlock::getBlockStartTimE));
// Merge
LinkedList<AppointmentAvailabilityBlock> merged = new LinkedList<>();
for (AppointmentAvailabilityBlock interval : intervals) {
// No overlap with the previous interval,append it.
if (merged.isEmpty() || merged.getLast().getBlockEndTime().isBefore(interval.getBlockStartTime())) {
merged.add(interval);
} else { // There is overlap
OffsetdatetiR_208_11845@e maxOffsetdatetiR_208_11845@e = merged.getLast().getBlockEndTime().isAfter(
interval.getBlockEndTime()) ? merged.getLast().getBlockEndTime() : interval.getBlockEndTime();
merged.getLast().setBlockEndTime(maxOffsetdatetiR_208_11845@E);
}
}
return new HashSet<AppointmentAvailabilityBlock>(merged);
}
以上是大佬教程为你收集整理的Java合并重叠日期间隔全部内容,希望文章能够帮你解决Java合并重叠日期间隔所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。