判断多个时间(数值)区间段是否出现重叠(时间工具类)
一、工具类代码:
package com.sszh.util.date;import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @title: 时间工具类-判断多个时间段是否出现重叠* @version v1.0.0* @author 研发中心-SSZH* @date 2019年05月06日 下午17:28:46 周一**/
public class TimeSlotUtil {/*** 判断【时段区间】是否重叠* * @param lsitMap 区间集合 * date 与这个区间绑定的ID信息或描述信息(用于执行成功后后续操作的标识符)* startArea 区间开始值* endArea 区间结束值* [* {date=AS08998AS0DF8A0S9DF8, startArea=10800000, endArea=21600000},* {date=AS08998AS0DF8A0S9DF9, startArea=21600000, endArea=28800000},* {date=AS08998AS0DF8A0S9DG0, startArea=25200000, endArea=32400000}* ]* * @param doFristStop 中断操作 * true 只要有重叠,立即返回* false 直到所有值遍历完才返回* @return* @throws Exception*/public static List<Map<String, String>> checkTimeArea(List<Map<String, String>> lsitMap, boolean doFristStop) throws Exception {SimpleDateFormat SDF_HH_MM_SS = new SimpleDateFormat("HH:mm:ss");Collections.sort(lsitMap, new Comparator<Map<String, String>>() {@Overridepublic int compare(Map<String, String> o1, Map<String, String> o2) {Long num_1 = Long.valueOf(o1.get("startArea"));Long num_2 = Long.valueOf(o2.get("startArea"));int result = num_1.compareTo(num_2);return result;}});List<Map<String, String>> retList = new ArrayList<Map<String, String>>();Map<String, String> retMap = null;for (int i = 0; i < lsitMap.size(); i++) {BigDecimal startInt = new BigDecimal(lsitMap.get(i).get("startArea"));BigDecimal endInt = new BigDecimal(lsitMap.get(i).get("endArea"));for (int j = i + 1; j < lsitMap.size(); j++) {BigDecimal toStartInt = new BigDecimal(lsitMap.get(j).get("startArea"));BigDecimal toEndInt = new BigDecimal(lsitMap.get(j).get("endArea"));/*** 如果指定的数与参数相等返回0。* 如果指定的数小于参数返回 -1。* 如果指定的数大于参数返回 1。** 案例:* Integer x = 5;* System.out.println(x.compareTo(3));* System.out.println(x.compareTo(5));* System.out.println(x.compareTo(8));** 输出结果:* 1* 0* -1**/if (toStartInt.compareTo(endInt) == -1 || (startInt.compareTo(toStartInt) == 0 && endInt.compareTo(toEndInt) == 0)) {retMap = new HashMap<String, String>();retMap.put("old", lsitMap.get(i).get("date"));retMap.put("oldArea", SDF_HH_MM_SS.format(new Date(Long.valueOf(lsitMap.get(i).get("startArea")))) + "-" + SDF_HH_MM_SS.format(new Date(Long.valueOf(lsitMap.get(i).get("endArea")))));retMap.put("new", lsitMap.get(j).get("date"));retMap.put("newArea", SDF_HH_MM_SS.format(new Date(Long.valueOf(lsitMap.get(j).get("startArea")))) + "-" + SDF_HH_MM_SS.format(new Date(Long.valueOf(lsitMap.get(j).get("endArea")))));retList.add(retMap);if (doFristStop) {return retList;}}}}return retList;}/*** 判断【数字区间】是否重叠* * @param lsitMap 区间集合* date 与这个区间绑定的ID信息或描述信息(用于执行成功后后续操作的标识符)* startArea 区间开始值* endArea 区间结束值* [* {date=AS08998AS0DF8A0S9DF8, startArea=10800000, endArea=21600000},* {date=AS08998AS0DF8A0S9DF9, startArea=21600000, endArea=28800000},* {date=AS08998AS0DF8A0S9DG0, startArea=25200000, endArea=32400000}* ]* * @param doFristStop 中断操作 * true 只要有重叠,立即返回* false 直到所有值遍历完才返回* @return* @throws Exception*/public static List<Map<String, String>> checkMunberArea(List<Map<String, String>> lsitMap, boolean doFristStop) throws Exception {Collections.sort(lsitMap, new Comparator<Map<String, String>>() {@Overridepublic int compare(Map<String, String> o1, Map<String, String> o2) {Long num_1 = Long.valueOf(o1.get("startArea"));Long num_2 = Long.valueOf(o2.get("startArea"));int result = num_1.compareTo(num_2);return result;}});List<Map<String, String>> retList = new ArrayList<Map<String, String>>();Map<String, String> retMap = null;for (int i = 0; i < lsitMap.size(); i++) {BigDecimal endInt = new BigDecimal(lsitMap.get(i).get("endArea"));for (int j = i + 1; j < lsitMap.size(); j++) {BigDecimal toBeginInt = new BigDecimal(lsitMap.get(j).get("startArea"));if (toBeginInt.compareTo(endInt) == -1) {retMap = new HashMap<String, String>();retMap.put("old", lsitMap.get(i).get("date"));retMap.put("oldArea", Long.valueOf(lsitMap.get(i).get("startArea")) + ", " + Long.valueOf(lsitMap.get(i).get("endArea")));retMap.put("new", lsitMap.get(j).get("date"));retMap.put("newArea", Long.valueOf(lsitMap.get(j).get("startArea")) + ", " + Long.valueOf(lsitMap.get(j).get("endArea")));retList.add(retMap);if (doFristStop) {return retList;}}}}return retList;}}
二、测试案例:
public static void main(String[] args) throws Exception {/*** 用法一:测试数值区间重叠*/// List<Map<String, String>> lsitMap = new ArrayList<Map<String, String>>();// Map<String, String> map = new HashMap<String, String>();// map.put( "date", "***测试111111"); //这里存放的是与这组数据绑定的ID信息,便于记录哪一组区间发生重叠// map.put("startArea", String.valueOf(SDF.parse(NOW_DATE + "11:00:00").getTime())); //区间开始值// map.put( "endArea", String.valueOf(SDF.parse(NOW_DATE + "14:00:00").getTime())); //区间结束值// lsitMap.add(map);// map = new HashMap<String, String>();// map.put( "date", "***测试222222");// map.put("startArea", String.valueOf(SDF.parse(NOW_DATE + "14:00:00").getTime()));// map.put( "endArea", String.valueOf(SDF.parse(NOW_DATE + "16:00:00").getTime()));// lsitMap.add(map);// map = new HashMap<String, String>();// map.put( "date", "***测试333333");// map.put("startArea", String.valueOf(SDF.parse(NOW_DATE + "15:00:00").getTime()));// map.put( "endArea", String.valueOf(SDF.parse(NOW_DATE + "17:00:00").getTime()));// lsitMap.add(map);// List<Map<String, String>> retList = checkMunberArea(lsitMap);// for (Map<String, String> mmp : retList) {// System.out.println("【"+mmp.get("old")+"】区间值:[" + mmp.get("oldArea") + "]与【"+mmp.get("new")+"】区间值["+ mmp.get("newArea") +"]发生重叠");// }/*** 用法二:测试时段区间重叠*/// List<Map<String, String>> lsitMap = new ArrayList<Map<String, String>>();// Map<String, String> map = new HashMap<String, String>();// map.put( "date", "测试***名称-***测试111111"); //这里存放的是与这组数据绑定的ID信息,便于记录哪一组区间发生重叠// map.put("startArea", String.valueOf(SDF.parse(NOW_DATE + "11:00:00").getTime())); //区间开始值// map.put( "endArea", String.valueOf(SDF.parse(NOW_DATE + "15:00:00").getTime())); //区间结束值// lsitMap.add(map);// map = new HashMap<String, String>();// map.put( "date", "测试***名称-***测试222222");// map.put("startArea", String.valueOf(SDF.parse(NOW_DATE + "14:00:00").getTime()));// map.put( "endArea", String.valueOf(SDF.parse(NOW_DATE + "16:00:00").getTime()));// lsitMap.add(map);// map = new HashMap<String, String>();// map.put( "date", "测试***名称-***测试333333");// map.put("startArea", String.valueOf(SDF.parse(NOW_DATE + "15:00:00").getTime()));// map.put( "endArea", String.valueOf(SDF.parse(NOW_DATE + "17:00:00").getTime()));// lsitMap.add(map);// List<Map<String, String>> retList = checkTimeArea(lsitMap, true);// for (Map<String, String> mmp : retList) {// System.out.println("***冲突:【"+mmp.get("old")+"】与【"+mmp.get("new")+"】时段发生重叠,具体重叠时段:[" + mmp.get("oldArea") + "]["+ mmp.get("newArea") +"]");// }}
注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!
持续更新中…
如有对思路不清晰或有更好的解决思路,欢迎与本人交流,QQ群:273557553
你遇到的问题是小编创作灵感的来源!
判断多个时间(数值)区间段是否出现重叠(时间工具类)相关推荐
- java判断某个数值是否在一个数值区间内
区间判断工具类的编写 说明 重点:区间工具类(转载:前行123的博客) 使用 说明 开发中,有这么一个需求,需要根据某些属性值来进行等级判断,并把判断好的结果持久化到数据库中.而这些等级区间的格式是这 ...
- 算法会议室问题及计算重叠时间区间段
算法会议室问题及计算重叠时间区间段 1. 会议室问题 2. 计算重叠时间区间段 1. 会议室问题 package com.zrj.algorithm.test;import cn.hutool.cor ...
- python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解
使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作.我们可以使用 if else 进行判断,但是,既然使用了 Python,那我们当然是想找一下有没有现成的轮子可以用. ...
- Excel中返回某个数所在的区间段
问题描述 最近在工作中需要用到圆桌随机来确定掉落的一个物品,里面有涉及到如何根据随机出的一个数值来确定这个数值所在的区间段.具体问题描述如下: 有5个物品A.B.C.D.E.无,它们的权重(为简单起见 ...
- Pandas把dataframe中的整数数值(integer)转化为时间(日期、时间)信息实战
Pandas把dataframe中的整数数值(integer)转化为时间(日期.时间)信息实战 目录 Pandas把dataframe中的整数数值转化为时间(日期.时间)信息实战
- ML之FE:数据处理—特征工程之特征三化(标准化【四大数据类型(数值型/类别型/字符串型/时间型)】、归一化、向量化)简介、代码实现、案例应用之详细攻略
ML之FE:数据处理-特征工程之特征三化(标准化[四大数据类型(数值型/类别型/字符串型/时间型)].归一化.向量化)简介.代码实现.案例应用之详细攻略 目录 真正意义的标准化与归一化 1.标准化/Z ...
- ajax定时器怎么写,js定时器怎么写?就是在特定时间执行某段程序
js定时器怎么写?就是在特定时间执行某段程序 复制代码 代码如下: $(function(){ var handler = function(){ } var timer = setInterval( ...
- python判断序列值横穿整个区间的次数
这里需要用的集合的知识,一般python集合会用intervals库或portion库,这里我们用portion库 intervals库github:https://github.com/kveste ...
- 【PTA】5-2 下列程序读入时间数值,将其加1秒后输出,时间格式为:hh: mm: ss,即“小时:分钟:秒”,当小时等于24小时,置为0。
5-2 下列程序读入时间数值,将其加1秒后输出,时间格式为:hh: mm: ss,即"小时:分钟:秒",当小时等于24小时,置为0. #include <stdio.h> ...
最新文章
- linux 新建用户配置文件 /etc/login.defs 简介
- 【移动开发】安卓Lab2(02)
- axios 请求的配置选项
- java static new_java静态类new的对象是否能被回收?
- MyBatisPlus_查询分页篇_入门试炼_02
- java rmi接口 超时设置_Spring RMI客户端读超时设置 | 学步园
- # WordPress 除了主页以外的页面都提示Not Found的问题(Centos)
- 信息学奥赛一本通(1173:阶乘和)
- aspose word 转pdf中文乱码_pdf转word——都是乱码!怎么办
- Android快速开发(2)
- Stage3D 入门资源汇总
- 9. 2019美赛论文提交注意事项
- zabbix3.0监控详解
- JAVA VM(HotSpot)
- windows10计算机用户密码,win10系统更改administrator账户密码图文教程
- 关于opencv在vs201x中的设置 2020-02-04
- Oracle数据库如何收费
- 买手机怎么选?答:看图买
- 冒泡排序--咕噜咕噜
- 互联网从此没有 BAT,该来的还是来了!