Java?多個(gè)時(shí)間區(qū)間進(jìn)行合并處理方法
需求:用戶在選擇多個(gè)時(shí)間區(qū)間之后,如選擇的時(shí)間區(qū)間連續(xù)或者有重疊,需要對(duì)所選的時(shí)間區(qū)間進(jìn)行合并
這其實(shí)是一個(gè)區(qū)間合并問(wèn)題,為了簡(jiǎn)化操作,將拿到的集合進(jìn)行排序后再合并
廢話不多說(shuō),源碼如下:
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 獲取兩個(gè)時(shí)間之間相差的天數(shù)
* @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尾部往前逐個(gè)合并
* @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 兩個(gè)時(shí)間區(qū)間合并操作
* @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排序操作,根據(jù)時(shí)間區(qū)間起始值排序
* @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() {
}
}
到此這篇關(guān)于Java 多個(gè)時(shí)間區(qū)間進(jìn)行合并處理的文章就介紹到這了,更多相關(guān)Java 多個(gè)時(shí)間區(qū)間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot使用validation進(jìn)行自參數(shù)校驗(yàn)的方法
在SpringBoot項(xiàng)目中,利用validation依賴可以通過(guò)注解方式校驗(yàn)數(shù)據(jù)庫(kù)交互參數(shù),提高代碼可讀性和維護(hù)性,此方法避免了硬編碼校驗(yàn)規(guī)則,方便后期規(guī)則變更,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-09-09
詳細(xì)聊聊RabbitMQ竟無(wú)法反序列化List問(wèn)題
這篇文章主要給大家介紹了關(guān)于RabbitMQ竟無(wú)法反序列化List的相關(guān)資料,文中通過(guò)示例代碼將問(wèn)題以及解決的過(guò)程介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-09-09
JavaWeb實(shí)現(xiàn)文件上傳與下載實(shí)例詳解
在Web應(yīng)用程序開發(fā)中,文件上傳與下載功能是非常常用的功能,下面通過(guò)本文給大家介紹JavaWeb實(shí)現(xiàn)文件上傳與下載實(shí)例詳解,對(duì)javaweb文件上傳下載相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-02-02
Spring?Boot項(xiàng)目中解決跨域問(wèn)題的四種方式總結(jié)
這篇文章主要介紹了瀏覽器同源策略限制導(dǎo)致的跨域問(wèn)題,并詳細(xì)記錄了常見(jiàn)的跨域解決方案,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02
Springboot中動(dòng)態(tài)語(yǔ)言groovy介紹
Apache的Groovy是Java平臺(tái)上設(shè)計(jì)的面向?qū)ο缶幊陶Z(yǔ)言,這門動(dòng)態(tài)語(yǔ)言擁有類似Python、Ruby和Smalltalk中的一些特性,可以作為Java平臺(tái)的腳本語(yǔ)言使用,這篇文章主要介紹了springboot中如何使用groovy,需要的朋友可以參考下2022-09-09
基于Java實(shí)現(xiàn)簡(jiǎn)易的七星彩號(hào)碼生成器
七星彩是中國(guó)體育彩票的一種玩法,由中國(guó)國(guó)家體育總局體育彩票管理中心統(tǒng)一發(fā)行。本文為大家準(zhǔn)備了一個(gè)七星彩號(hào)碼生成器Java工具類,感興趣的可以了解一下2022-08-08
springboot項(xiàng)目不輸出nohup.out日志的解決
這篇文章主要介紹了springboot項(xiàng)目不輸出nohup.out日志的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07

