首页 > 编程语言 >Java如何将若干时间区间进行合并的方法步骤

Java如何将若干时间区间进行合并的方法步骤

时间:2023-02-03 10:25:07浏览次数:41  
标签:00 01 Java 步骤 PeriodDto 区间 new prev 若干

java如何将若干时间区间进行合并的方法步骤

问题原因

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

1、 先对日期区间进行按时间顺序排序,这样后一个区间(记为next)的from一定是不小于前一个(记为prev)from的。

2、在进行循环比较的时候,对于next区间,假设next.from大于prev.to就说明这两个区间是分开的,要新增区间。否则说明next.from在[prev.from, prev.to]内,这时要看next.to是否是大于prev.to,如果大于就要合并区间。

具体实现

public static List
mergePeriod(List
periodList) {

List

result=new ArrayList
();

if (periodList==null || periodList.size() < 1) {

  return result;

}

// 对区间进行排序

Collections.sort(periodList, new Comparator

() {

  @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-iHwcFpQGF04-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

list=new ArrayList
();

list.add(date1);

list.add(date2);

list.add(date3);

list.add(date4);



List

result=mergePeriod(list);

System.out.println(jsONObject.toJSONStringWithDateFormat(result, JSONObject.DEFFAULT_DATE_FORMAT));

}

运行结果:

[]

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.*;

class Main {

static List f=new ArrayList<>();

public static void main(String[] args) throws

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(){

  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] >http:// ed) res ++;

  ed=Math.max(ed, t[1]);

}

System.out.println(res);

}

}

标签:00,01,Java,步骤,PeriodDto,区间,new,prev,若干
From: https://www.cnblogs.com/dituirenwu/p/17088286.html

相关文章

  • 在Java中出现运行命令过长如何解决
    在启动程序时出现如下代码:  只需在.idea中找到workspace.xml文件,在如下位置加上代码  "dynamic.classpath":"true",  ......
  • Java里什么是POJO
    POJO(PlainOrdinaryJavaObject)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。POJO和JavaBean是我们常见的两个关键字,一般容易混淆,POJO全称是Pl......
  • java(18) 泛型
    Java泛型Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是......
  • Java(19)枚举
    Java枚举是一个特殊的类,一般表示一组常量,比如一年的4个季节,一个年的12个月份,一个星期的7天,方向有东南西北等。Java枚举类使用enum关键字来定义,各个常量使用逗号......
  • java(17)io流
    JavaIO流详解1.什么是IOJava中I/O操作主要是指使用Java进行输入,输出操作.Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。......
  • java语法
    一、常量和变量1、数据类型基本数据类型:Boolean、byte、short、int、long、char、float、double。它们分别占用字节数为1、1、2、4、8、2、4、8引用类型:数组、字符串、......
  • Java中ArrayList的扩容机制
    1.简介publicclassArrayList<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Cloneable,java.io.SerializableArrayList的底层基于数组来实现,故......
  • java介绍、环境搭建与Hello,World!
    java的诞生C与C++C语言1972年贝尔实验室操作系统、编译器等偏底层应用指针和内存管理漏洞C++1982年面向对象对C兼容在图形领域、游戏领域等方面常用jav......
  • JavaScript学习笔记—DOM:元素的添加、修改、删除
    appendChild(node):向节点添加最后一个子节点insertAdjacentHTML(position,text):把元素插入到指定位置position:beforebegin-插入到当前元素的前面,即开始标签之前a......
  • Java super关键字
    java中的super关键字是一个引用变量,用于引用直接父类对象。每当创建子类的实例时,父类的实例被隐式创建,由super关键字引用变量引用。javasuper关键字的用法如下:super......