Java多个时间段合并

时间是程序中一个非常重要的概念,尤其在需要处理时间段的情况下。在Java中,我们经常会遇到需要合并多个时间段的需求。本文将介绍如何使用Java合并多个时间段,并提供相应的代码示例。

什么是时间段

时间段(Interval)是指一段连续的时间范围,通常由开始时间和结束时间组成。例如,从2021年1月1日上午10点到下午2点的时间段可以表示为[2021-01-01 10:00, 2021-01-01 14:00]。

合并多个时间段

合并多个时间段是指将多个时间段合并为一个更大的时间段,其中包含所有输入时间段的时间范围。例如,如果有两个时间段[2021-01-01 10:00, 2021-01-01 12:00]和[2021-01-01 11:00, 2021-01-01 14:00],合并后的时间段为[2021-01-01 10:00, 2021-01-01 14:00]。

为了实现时间段的合并,我们可以使用以下步骤:

  1. 首先,将所有时间段按照开始时间进行排序。
  2. 创建一个空的结果列表,用于存储合并后的时间段。
  3. 遍历排序后的时间段列表,逐个与结果列表中的最后一个时间段进行比较:
    • 如果当前时间段与结果列表中的最后一个时间段有重叠部分,则将两个时间段合并为一个更大的时间段。
    • 否则,将当前时间段添加到结果列表中。
  4. 返回结果列表,即为合并后的时间段。

下面是一个使用Java实现时间段合并的示例代码:

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

class Interval {
    public int start;
    public int end;

    public Interval(int start, int end) {
        this.start = start;
        this.end = end;
    }
}

public class IntervalMerger {
    public List<Interval> merge(List<Interval> intervals) {
        if (intervals == null || intervals.size() <= 1) {
            return intervals;
        }

        // 按照开始时间进行排序
        Collections.sort(intervals, Comparator.comparingInt(interval -> interval.start));

        List<Interval> result = new ArrayList<>();
        Interval currentInterval = intervals.get(0);
        result.add(currentInterval);

        for (Interval interval : intervals) {
            if (interval.start <= currentInterval.end) {
                currentInterval.end = Math.max(currentInterval.end, interval.end);
            } else {
                currentInterval = interval;
                result.add(currentInterval);
            }
        }

        return result;
    }

    public static void main(String[] args) {
        IntervalMerger intervalMerger = new IntervalMerger();
        List<Interval> intervals = new ArrayList<>();
        intervals.add(new Interval(1, 3));
        intervals.add(new Interval(2, 6));
        intervals.add(new Interval(8, 10));
        intervals.add(new Interval(15, 18));

        List<Interval> mergedIntervals = intervalMerger.merge(intervals);
        for (Interval interval : mergedIntervals) {
            System.out.println("[" + interval.start + ", " + interval.end + "]");
        }
    }
}

在以上示例代码中,我们定义了一个Interval类来表示时间段,并创建了一个IntervalMerger类来实现时间段合并。merge方法接受一个List<Interval>参数,并返回合并后的时间段列表。

merge方法中,我们首先对输入的时间段列表按照开始时间进行排序。然后,创建一个空的结果列表,并将第一个时间段添加到结果列表中。

接下来,我们遍历排序后的时间段列表,逐个与结果列表中的最后一个时间段进行比较。如果当前时间段与结果列表中的最后一个时间段有重叠部分,则将两个时间段合并为一个更大的时间段,即更新结果列表中的最后一个时间段的结束时间;否则,将当前时间段添加到结果列表中。

最后,返回结果列表,即为合并后的时间段。

序列图

下面是一个使用Mermaid语法绘制的合并多个时间段的序列图:

sequenceDiagram
    participant A as 输入时间段
    participant B as