程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Java合并重叠日期间隔大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Java合并重叠日期间隔?

开发过程中遇到Java合并重叠日期间隔的问题如何解决?下面主要结合日常开发的经验,给出你关于Java合并重叠日期间隔的解决方法建议,希望对你解决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):

Java合并重叠日期间隔

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合并重叠日期间隔

注意:我正在使用带有 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,请注明来意。