Java 多个时间区间进行合并处理方法
作者:kk_star
用户在选择多个时间区间之后,如选择的时间区间连续或者有重叠,需要对所选的时间区间进行合并,这其实是一个区间合并问题,下面通过本文给大家介绍Java 多个时间区间进行合并处理的解决方案,一起看看吧
需求:用户在选择多个时间区间之后,如选择的时间区间连续或者有重叠,需要对所选的时间区间进行合并
这其实是一个区间合并问题,为了简化操作,将拿到的集合进行排序后再合并
废话不多说,源码如下:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * @ClassName DateU * @Description TODO * @Author kk_star * @Date 2021/4/9 14:59 */ public class DateU { public static void main(String[] args) { List<DateEntity> list = new ArrayList<>(); DateEntity de1 = new DateEntity("2021-01-10","2021-02-15"); DateEntity de2 = new DateEntity("2021-01-01","2021-01-06"); DateEntity de3 = new DateEntity("2021-03-01","2021-03-15"); DateEntity de4 = new DateEntity("2021-01-07","2021-01-09"); DateEntity de5 = new DateEntity("2021-02-16","2021-02-28"); list.add(de1); list.add(de2); list.add(de3); list.add(de4); list.add(de5); //list排序,方便合并操作 sort(list); System.out.println("合并前:"+list.toString()); List<DateEntity> resultList = handle(list); sort(resultList); System.out.println("合并后:"+resultList); } /* * @Description 获取两个时间之间相差的天数 * @Author kk_star * @Date 2021/4/9 16:59 * @param date1 * @param date2 * @return long */ public static long getDiffDays(Date date1,Date date2){ long t1 = date1.getTime(); long t2 = date2.getTime(); if(t1 == t2){ return 0L; }else if(t1>t2){ return (t1-t2)/(1000*60*60*24); }else{ return (t2-t1)/(1000*60*60*24); } } /** * @Description 操作-从list尾部往前逐个合并 * @Author kk_star * @Date 2021/4/9 17:00 * @param list * @return java.util.List<DateEntity> */ public static List<DateEntity> handle(List<DateEntity> list){ List<DateEntity> resultList = new ArrayList<>(); for (int i=1;;i++){ if(list.size()<=1){ if(list.size()==1){ resultList.add(list.get(0)); } break; } DateEntity last = list.get(list.size()-1); DateEntity beLast = list.get(list.size()-2); DateEntity m = mergeTime(beLast,last); if(null != m){ list.remove(last); list.remove(beLast); list.add(m); }else{ resultList.add(last); list.remove(last); } } return resultList; } /** * @Description 两个时间区间合并操作 * @Author kk_star * @Date 2021/4/9 17:00 * @param beLast * @param last * @return DateEntity */ public static DateEntity mergeTime(DateEntity beLast,DateEntity last){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); DateEntity result = new DateEntity(); try{ Date d2 = sdf.parse(beLast.getEndTime()); Date d3 = sdf.parse(last.getStartTime()); Date d4 = sdf.parse(last.getEndTime()); if(d2.getTime()>=d3.getTime()){ result.setStartTime(beLast.getStartTime()); if(d2.getTime()>=d4.getTime()){ result.setEndTime(beLast.getEndTime()); }else{ result.setEndTime(last.getEndTime()); } return result; }else{ if(getDiffDays(d2,d3)<=1){ result.setStartTime(beLast.getStartTime()); result.setEndTime(last.getEndTime()); return result; }else{ return null; } } }catch (Exception e){ System.err.println(e.getMessage()); } return null; } /** * @Description list排序操作,根据时间区间起始值排序 * @Author kk_star * @Date 2021/4/9 17:02 * @param list * @return void */ public static void sort(List<DateEntity> list){ Collections.sort(list, new Comparator<DateEntity>() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); @Override public int compare(DateEntity o1, DateEntity o2) { try { if(sdf.parse(o1.getStartTime()).getTime()-sdf.parse(o2.getStartTime()).getTime()>=0){ return 1; }else{ return -1; } } catch (ParseException e) { e.printStackTrace(); } return 0; } }); } }
import lombok.Data; /** * @ClassName DateEntity * @Description TODO * @Author kk_star * @Date 2021/4/9 15:15 */ @Data public class DateEntity { public String startTime; public String endTime; public DateEntity(String startTime, String endTime) { this.startTime = startTime; this.endTime = endTime; } public DateEntity() { } }
到此这篇关于Java 多个时间区间进行合并处理的文章就介绍到这了,更多相关Java 多个时间区间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!