Java三个时间段集合,合并到一个时间段集合

如果你有三个时间段集合,并且希望将它们合并为一个时间段集合,你可以按照以下步骤进行操作:

  1. 将三个时间段集合合并成一个大的时间段集合。

  2. 对合并后的时间段集合按照起始时间进行排序,确保它们按照时间先后顺序排列。

  3. 逐个检查时间段是否有重叠部分,并进行合并操作。

下面是一个使用Java代码实现上述逻辑的示例:

import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class TimeRangeMergeExample {
    public static void main(String[] args) {
        // 假设有三个时间段集合
        List<TimeRange> timeRanges1 = new ArrayList<>();
        timeRanges1.add(new TimeRange(LocalTime.of(9, 0), LocalTime.of(10, 0)));
        timeRanges1.add(new TimeRange(LocalTime.of(11, 0), LocalTime.of(12, 0)));

        List<TimeRange> timeRanges2 = new ArrayList<>();
        timeRanges2.add(new TimeRange(LocalTime.of(9, 30), LocalTime.of(10, 30)));
        timeRanges2.add(new TimeRange(LocalTime.of(12, 0), LocalTime.of(13, 0)));

        List<TimeRange> timeRanges3 = new ArrayList<>();
        timeRanges3.add(new TimeRange(LocalTime.of(10, 0), LocalTime.of(11, 0)));
        timeRanges3.add(new TimeRange(LocalTime.of(13, 0), LocalTime.of(14, 0)));

        // 合并时间段集合
        List<TimeRange> mergedTimeRanges = new ArrayList<>();
        mergedTimeRanges.addAll(timeRanges1);
        mergedTimeRanges.addAll(timeRanges2);
        mergedTimeRanges.addAll(timeRanges3);

        // 按照起始时间排序
        Collections.sort(mergedTimeRanges, Comparator.comparing(TimeRange::getStartTime));

        // 合并时间段
        List<TimeRange> finalTimeRanges = new ArrayList<>();
        TimeRange currentRange = mergedTimeRanges.get(0);

        for (int i = 1; i < mergedTimeRanges.size(); i++) {
            TimeRange nextRange = mergedTimeRanges.get(i);

            if (currentRange.getEndTime().isAfter(nextRange.getStartTime())) {
                // 有重叠部分,更新当前时间段的结束时间
                currentRange.setEndTime(nextRange.getEndTime());
            } else {
                // 没有重叠部分,添加当前时间段到最终结果集合,并更新当前时间段为下一个时间段
                finalTimeRanges.add(currentRange);
                currentRange = nextRange;
            }
        }

        // 添加最后一个时间段到最终结果集合
        finalTimeRanges.add(currentRange);

        // 输出合并后的时间段集合
        for (TimeRange timeRange : finalTimeRanges) {
            System.out.println(timeRange);
        }
    }
}

class TimeRange {
    private LocalTime startTime;
    private LocalTime endTime;

    public TimeRange(LocalTime startTime, LocalTime endTime) {
        this.startTime = startTime;
        this.endTime = endTime;
    }

    public LocalTime getStartTime() {
        return startTime;
    }

    public LocalTime getEndTime() {
        return endTime;
    }

    public void setEndTime(LocalTime endTime) {
        this.endTime = endTime;
    }

    @Override
    public String toString() {
        return startTime + " - " + endTime;
    }
}

在上述示例中,我们使用TimeRange类表示时间段,将三个时间段集合合并为一个大的时间段集合,并按照起始时间进行排序。然后,我们逐个检查时间段是否有重叠部分,并进行合并操作,最终得到合并后的时间段集合。

请注意,上述示例中的时间段集合仅为示意,你可以根据实际情况调整时间段的起始时间和结束时间。

通过状态来划分时间段优先级

如果你想在上述示例的基础上添加状态,并根据状态来划分时间段的优先级,你可以对TimeRange类进行扩展,添加一个表示状态的字段,并在合并时间段时考虑状态的优先级。

下面是一个修改后的示例代码:

import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class TimeRangeMergeWithPriorityExample {
    public static void main(String[] args) {
        // 假设有三个时间段集合,每个时间段都有一个状态(优先级)
        List<TimeRangeWithPriority> timeRanges1 = new ArrayList<>();
        timeRanges1.add(new TimeRangeWithPriority(LocalTime.of(9, 0), LocalTime.of(10, 0), 2));
        timeRanges1.add(new TimeRangeWithPriority(LocalTime.of(11, 0), LocalTime.of(12, 0), 1));

        List<TimeRangeWithPriority> timeRanges2 = new ArrayList<>();
        timeRanges2.add(new TimeRangeWithPriority(LocalTime.of(9, 30), LocalTime.of(10, 30), 1));
        timeRanges2.add(new TimeRangeWithPriority(LocalTime.of(12, 0), LocalTime.of(13, 0), 3));

        List<TimeRangeWithPriority> timeRanges3 = new ArrayList<>();
        timeRanges3.add(new TimeRangeWithPriority(LocalTime.of(10, 0), LocalTime.of(11, 0), 3));
        timeRanges3.add(new TimeRangeWithPriority(LocalTime.of(13, 0), LocalTime.of(14, 0), 2));

        // 合并时间段集合
        List<TimeRangeWithPriority> mergedTimeRanges = new ArrayList<>();
        mergedTimeRanges.addAll(timeRanges1);
        mergedTimeRanges.addAll(timeRanges2);
        mergedTimeRanges.addAll(timeRanges3);

        // 按照起始时间和状态优先级排序
        Collections.sort(mergedTimeRanges, Comparator.comparing(TimeRangeWithPriority::getStartTime)
                .thenComparingInt(TimeRangeWithPriority::getPriority));

        // 合并时间段
        List<TimeRangeWithPriority> finalTimeRanges = new ArrayList<>();
        TimeRangeWithPriority currentRange = mergedTimeRanges.get(0);

        for (int i = 1; i < mergedTimeRanges.size(); i++) {
            TimeRangeWithPriority nextRange = mergedTimeRanges.get(i);

            if (currentRange.getEndTime().isAfter(nextRange.getStartTime())) {
                // 有重叠部分,更新当前时间段的结束时间
                currentRange.setEndTime(nextRange.getEndTime());
            } else {
                // 没有重叠部分,添加当前时间段到最终结果集合,并更新当前时间段为下一个时间段
                finalTimeRanges.add(currentRange);
                currentRange = nextRange;
            }
        }

        // 添加最后一个时间段到最终结果集合
        finalTimeRanges.add(currentRange);

        // 输出合并后的时间段集合
        for (TimeRangeWithPriority timeRange : finalTimeRanges) {
            System.out.println(timeRange);
        }
    }
}

class TimeRangeWithPriority {
    private LocalTime startTime;
    private LocalTime endTime;
    private int priority;

    public TimeRangeWithPriority(LocalTime startTime, LocalTime endTime, int priority) {
        this.startTime = startTime;
        this.endTime = endTime;
        this.priority = priority;
    }

    public LocalTime getStartTime() {
        return startTime;
    }

    public LocalTime getEndTime() {
        return endTime;
    }

    public void setEndTime(LocalTime endTime) {
        this.endTime = endTime;
    }

    public int getPriority() {
        return priority;
    }

    @Override
    public String toString() {
        return startTime + " - " + endTime + " (Priority: " + priority + ")";
    }
}

在上述示例中,我们对TimeRangeWithPriority类进行了扩展,添加了一个表示状态优先级的字段。在合并时间段时,我们首先按照起始时间进行排序,然后按照状态优先级进行排序。这样,合并时会优先考虑具有较高优先级的时间段。

请注意,上述示例中的时间段集合和优先级仅为示意,你可以根据实际情况调整时间段的起始时间、结束时间和优先级。

如何判断的优先级?

要判断时间段的状态优先级,你需要定义一个优先级规则,并根据该规则对时间段进行比较。以下是一个示例的优先级规则:

  1. 优先级较高的状态值越小,优先级较低的状态值越大。

  2. 如果两个时间段的状态优先级相同,则根据起始时间进行比较,起始时间早的时间段具有更高的优先级。

基于以上规则,你可以按照以下步骤判断时间段的状态优先级:

  1. TimeRangeWithPriority类中添加一个表示状态优先级的字段,例如priority

  2. 在合并时间段前,使用Comparator对时间段进行排序。首先按照起始时间进行排序,然后按照状态优先级进行排序。

Collections.sort(mergedTimeRanges, Comparator.comparing(TimeRangeWithPriority::getStartTime)
      .thenComparingInt(TimeRangeWithPriority::getPriority));

这样,合并时会优先考虑具有较高优先级的时间段。

请注意,以上示例中的优先级规则是一种假设,你可以根据实际需求定义自己的优先级规则。根据不同的规则,你可能需要调整比较逻辑和排序方式。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值