判断多个时间(数值)区间段是否出现重叠(时间工具类)

一、工具类代码:

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>>() {
			@Override
			public 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>>() {
			@Override
			public 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
你遇到的问题是小编创作灵感的来源!


  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值