问题原因

工作中突然有个场景,需要合并时间区间。将若干闭合时间区间合并,实现思路如下:

1、 先对日期区间进行按时间顺序排序,这样后一个区间(记为next)的from一定是不小于前一个(记为prev)from的。
2、在进行循环比较的时候,对于next区间,假设next.from大于prev.to就说明这两个区间是分开的,要新增区间。否则说明next.from在[prev.from, prev.to]内,这时要看next.to是否是大于prev.to,如果大于就要合并区间。

具体实现

  public static list<perioddto> mergeperiod(list<perioddto> periodlist) {
    list<perioddto> result = new arraylist<perioddto>();

    if (periodlist == null || periodlist.size() < 1) {
      return result;
    }

    // 对区间进行排序
    collections.sort(periodlist, new comparator<perioddto>() {
      @override
      public int compare(perioddto o1, perioddto o2) {
        if ((o1.getfrom().gettime() - o2.getfrom().gettime()) > 0) {
          return 1;
        } else if ((o1.getfrom().gettime() - o2.getfrom().gettime()) == 0) {
          return 0;
        } else {
          return -1;
        }
      }
    });
    perioddto prev = null;
    for (perioddto item : periodlist) {
      if (prev == null || prev.getto().before(item.getfrom())) {
        result.add(item);
        prev = item;
      } else if (prev.getto().before(item.getto())) {
        prev.setto(item.getto());
      }
    }

    return result;
  }

写个测试类验证下:

 public static void main(string[] args) throws parseexception {

    perioddto date1 = new perioddto();
    date1.setfrom(dateutils.fmtdate("2020-01-01 12:00:00"));
    date1.setto(dateutils.fmtdate("2021-01-01 12:00:00"));
    
    perioddto date2 = new perioddto();
    date2.setfrom(dateutils.fmtdate("2019-05-01 12:00:00"));
    date2.setto(dateutils.fmtdate("2020-04-29 12:00:00"));
    
    perioddto date3 = new perioddto();
    date3.setfrom(dateutils.fmtdate("2018-01-01 12:00:00"));
    date3.setto(dateutils.fmtdate("2019-01-01 12:00:00"));
    
    perioddto date4 = new perioddto();
    date4.setfrom(dateutils.fmtdate("2012-01-01 12:00:00"));
    date4.setto(dateutils.fmtdate("2023-01-01 12:00:00"));
    
    list<perioddto> list = new arraylist<perioddto>();
    list.add(date1);
    list.add(date2);
    list.add(date3);
    list.add(date4);
    
    list<perioddto> result = mergeperiod(list);
    
    system.out.println(jsonobject.tojsonstringwithdateformat(result, jsonobject.deffault_date_format));
  }

运行结果:

[{“from”:”2018-01-01 12:00:00″,”to”:”2019-01-01 12:00:00″},{“from”:”2019-05-01 12:00:00″,”to”:”2021-01-01 12:00:00″},{“from”:”2022-01-01 12:00:00″,”to”:”2023-01-01 12:00:00″}]

ok,完美收工,解决问题。

ps:补充示例

给定 n 个区间 [li,ri],要求合并所有有交集的区间。

注意如果在端点处相交,也算有交集。

输出合并完成后的区间个数。

例如:[1,3]和[2,6]可以合并为一个区间[1,6]。

输入格式
第一行包含整数n。

接下来n行,每行包含两个整数 l 和 r。

输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。

数据范围
1≤n≤100000,
−109≤li≤ri≤109
输入样例:
5
1 2
2 4
5 6
7 8
7 9
输出样例:
3

【代码:】

import java.io.*;
import java.util.*;

public class main {

  static list<int[]> f = new arraylist<>();

  public static void main(string[] args) throws ioexception{
    bufferedreader read = new bufferedreader(new inputstreamreader(system.in));
    int n = integer.parseint(read.readline());
    for(int i = 1; i <= n; i++) {
      string[] str = read.readline().split(" ");
      int[] t = {integer.parseint(str[0]),integer.parseint(str[1])};
      f.add(t);
    }
    f.sort(new comparator<int[]>(){
      public int compare(int[] o1, int[] o2){
        return o1[0] - o2[0];
      }
    });
    int ed = integer.min_value, res = 0;
    for (int[] t : f) {
      if(t[0] > ed) res ++;
      ed = math.max(ed, t[1]);
    }
    system.out.println(res);
  }
}

到此这篇关于java如何将若干时间区间进行合并的方法步骤的文章就介绍到这了,更多相关java 时间合并内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!