判斷多個時間(數值)區間段是否出現重疊(時間工具類)

一、工具類代碼:

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
你遇到的問題是小編創作靈感的來源!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章