Java如何将若干时间区间进行合并的方法步骤
问题原因
工作中突然有个场景,需要合并时间区间。将若干闭合时间区间合并,实现思路如下:
1、先对日期区间进行按时间顺序排序,这样后一个区间(记为next)的from一定是不小于前一个(记为prev)from的。
2、在进行循环比较的时候,对于next区间,假设next.from大于prev.to就说明这两个区间是分开的,要新增区间。否则说明next.from在[prev.from,prev.to]内,这时要看next.to是否是大于prev.to,如果大于就要合并区间。
具体实现
publicstaticListmergePeriod(List periodList){ List result=newArrayList (); if(periodList==null||periodList.size()<1){ returnresult; } //对区间进行排序 Collections.sort(periodList,newComparator (){ @Override publicintcompare(PeriodDtoo1,PeriodDtoo2){ if((o1.getFrom().getTime()-o2.getFrom().getTime())>0){ return1; }elseif((o1.getFrom().getTime()-o2.getFrom().getTime())==0){ return0; }else{ return-1; } } }); PeriodDtoprev=null; for(PeriodDtoitem:periodList){ if(prev==null||prev.getTo().before(item.getFrom())){ result.add(item); prev=item; }elseif(prev.getTo().before(item.getTo())){ prev.setTo(item.getTo()); } } returnresult; }
写个测试类验证下:
publicstaticvoidmain(String[]args)throwsParseException{
PeriodDtodate1=newPeriodDto();
date1.setFrom(DateUtils.fmtDate("2020-01-0112:00:00"));
date1.setTo(DateUtils.fmtDate("2021-01-0112:00:00"));
PeriodDtodate2=newPeriodDto();
date2.setFrom(DateUtils.fmtDate("2019-05-0112:00:00"));
date2.setTo(DateUtils.fmtDate("2020-04-2912:00:00"));
PeriodDtodate3=newPeriodDto();
date3.setFrom(DateUtils.fmtDate("2018-01-0112:00:00"));
date3.setTo(DateUtils.fmtDate("2019-01-0112:00:00"));
PeriodDtodate4=newPeriodDto();
date4.setFrom(DateUtils.fmtDate("2012-01-0112:00:00"));
date4.setTo(DateUtils.fmtDate("2023-01-0112:00:00"));
Listlist=newArrayList();
list.add(date1);
list.add(date2);
list.add(date3);
list.add(date4);
Listresult=mergePeriod(list);
System.out.println(JSONObject.toJSONStringWithDateFormat(result,JSONObject.DEFFAULT_DATE_FORMAT));
}
运行结果:
[{"from":"2018-01-0112:00:00","to":"2019-01-0112:00:00"},{"from":"2019-05-0112:00:00","to":"2021-01-0112:00:00"},{"from":"2022-01-0112:00:00","to":"2023-01-0112: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
12
24
56
78
79
输出样例:
3
【代码:】
importjava.io.*;
importjava.util.*;
publicclassMain{
staticListf=newArrayList<>();
publicstaticvoidmain(String[]args)throwsIOException{
BufferedReaderread=newBufferedReader(newInputStreamReader(System.in));
intn=Integer.parseInt(read.readLine());
for(inti=1;i<=n;i++){
String[]str=read.readLine().split("");
int[]t={Integer.parseInt(str[0]),Integer.parseInt(str[1])};
f.add(t);
}
f.sort(newComparator(){
publicintcompare(int[]o1,int[]o2){
returno1[0]-o2[0];
}
});
inted=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时间合并内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。