為什么寫這么一篇文章呢?
遇到了個問題,同一天可以輸入多個時間段,但是每個時間段的時間不能出現重疊。
納尼,這不就是判斷數據返回是否有重疊的變種嘛~
簡單,開搞
數字范圍是否重疊判斷
這里以int類型為例了,其它的也都類似
核心方法
/*** @param start1 第一個數據開始時間* @param end1 第一個數據結束時間* @param start2 第二個數據開始時間* @param end2 第二個數據結束時間* @return true:發生重疊 false:未發生重疊*/public static boolean isIntersect(int start1, int end1, int start2, int end2) {return Math.max(start1, start2) <= Math.min(end1, end2);}
4個參數start1-end1
代表第一組范圍,start2-end2
代表第二組范圍;
Math.max(start1, start2) <= Math.min(end1, end2)
使用Math.max
和Math.min
可以無視第一組數據和第二組數據的順序,只比較是否重疊,<=
代表0-1
后面不能是1-3
,只能是2-3
;如果想要1-3
的效果把=
去掉即可,后面會有演示。
核心方法非常簡單,那我們造一組偽數據測試一下吧。
測試數據
先來一組錯誤數據吧
[{"startNum": 0, "endNum": 100},{"startNum": 100, "endNum": 500},{"startNum": 400, "endNum": 1000},{"startNum": 1001, "endNum": 9999}
]
測試方法
public static void main(String[] args) {String str = "[\n" +" {\"startNum\": 0, \"endNum\": 100},\n" +" {\"startNum\": 100, \"endNum\": 500},\n" +" {\"startNum\": 500, \"endNum\": 1000},\n" +" {\"startNum\": 1001, \"endNum\": 9999}\n" +"]";JSONArray array = JSON.parseArray(str);for (int i = 0; i < array.size(); i++) {for (int j = i + 1; j < array.size(); j++) {boolean isOk = isIntersect(handleStr(array.getJSONObject(i).getString("startNum")),handleStr(array.getJSONObject(i).getString("endNum")),handleStr(array.getJSONObject(j).getString("startNum")),handleStr(array.getJSONObject(j).getString("endNum")));if (isOk) {System.out.println("no " + j + " and no " + (j + 1) + " is intersect");System.out.println("or say, "+ array.getJSONObject(i).getString("startNum")+ " to " + array.getJSONObject(i).getString("endNum")+ " and " + array.getJSONObject(j).getString("startNum")+ " to " + array.getJSONObject(j).getString("endNum")+ " is intersect");System.out.println("\n");}}}}
答案還是很清晰的哈~
數字范圍效果完成了。數值類的都類似哈
時間范圍是否重疊判斷
時間有很多種,我們一種一種的來說,實現都一樣,重要的是思想
首先來看一下下面這種格式,搞個錯誤數據吧
[{"startTime": "00:00", "endTime": "01:00"},{"startTime": "01:00", "endTime": "02:00"},{"startTime": "01:00", "endTime": "02:00"},{"startTime": "08:00", "endTime": "22:00"},{"startTime": "20:00", "endTime": "24:00"}]
因為01:00
是重疊的,所以我們把上面核心方法的=
去掉。如下
/*** @param start1 第一個數據開始時間* @param end1 第一個數據結束時間* @param start2 第二個數據開始時間* @param end2 第二個數據結束時間* @return true:發生重疊 false:未發生重疊*/public static boolean isIntersect(int start1, int end1, int start2, int end2) {return Math.max(start1, start2) < Math.min(end1, end2);}
接下來就很簡單了,把時間處理成數據類型就可以了,下面看一下處理的方法
public static int handleStr(String str) {str = str.replace(":", "");return Integer.parseInt(str);}
來一起看一下運行結果吧
public static void main(String[] args) {String data = " [\n" +" {\"startTime\": \"00:00\", \"endTime\": \"01:00\"},\n" +" {\"startTime\": \"01:00\", \"endTime\": \"02:00\"},\n" +" {\"startTime\": \"01:00\", \"endTime\": \"02:00\"},\n" +" {\"startTime\": \"08:00\", \"endTime\": \"22:00\"},\n" +" {\"startTime\": \"20:00\", \"endTime\": \"24:00\"}\n" +" ]";JSONArray array = JSON.parseArray(data);for (int i = 0; i < array.size(); i++) {for (int j = i + 1; j < array.size(); j++) {boolean isOk = isIntersect(handleStr(array.getJSONObject(i).getString("startTime")),handleStr(array.getJSONObject(i).getString("endTime")),handleStr(array.getJSONObject(j).getString("startTime")),handleStr(array.getJSONObject(j).getString("endTime")));if (isOk) {System.out.println("no " + j + " and no " + (j + 1) + " is intersect");System.out.println("or say, "+ array.getJSONObject(i).getString("startTime")+ " to " + array.getJSONObject(i).getString("endTime")+ " and " + array.getJSONObject(j).getString("startTime")+ " to " + array.getJSONObject(j).getString("endTime")+ " is intersect");System.out.println("\n");}}}}
對于時間類型,下面格式如何比較
[{"startTime": "2024-07-04 00:00:00", "endTime": "2024-07-04 10:00:00"},{"startTime": "2024-07-04 10:00:00", "endTime": "2024-07-04 12:00:00"},{"startTime": "2024-07-04 12:00:00", "endTime": "2024-07-04 13:00:00"},{"startTime": "2024-07-04 12:00:00", "endTime": "2024-07-04 18:00:00"},{"startTime": "2024-07-04 17:00:00", "endTime": "2024-07-04 23:00:00"}]
其實直接將時間轉為時間戳來比較就可以了,完整代碼如下:
public static void main(String[] args) {String data = "[\n" +" {\"startTime\": \"2024-07-04 00:00:00\", \"endTime\": \"2024-07-04 10:00:00\"},\n" +" {\"startTime\": \"2024-07-04 10:00:00\", \"endTime\": \"2024-07-04 12:00:00\"},\n" +" {\"startTime\": \"2024-07-04 12:00:00\", \"endTime\": \"2024-07-04 13:00:00\"},\n" +" {\"startTime\": \"2024-07-04 12:00:00\", \"endTime\": \"2024-07-04 18:00:00\"},\n" +" {\"startTime\": \"2024-07-04 17:00:00\", \"endTime\": \"2024-07-04 23:00:00\"}\n" +" ]";JSONArray array = JSON.parseArray(data);for (int i = 0; i < array.size(); i++) {for (int j = i + 1; j < array.size(); j++) {boolean isOk = isIntersect(handleDate(array.getJSONObject(i).getString("startTime")),handleDate(array.getJSONObject(i).getString("endTime")),handleDate(array.getJSONObject(j).getString("startTime")),handleDate(array.getJSONObject(j).getString("endTime")));if (isOk) {System.out.println("no " + j + " and no " + (j + 1) + " is intersect");System.out.println("or say, "+ array.getJSONObject(i).getString("startTime")+ " to " + array.getJSONObject(i).getString("endTime")+ " and " + array.getJSONObject(j).getString("startTime")+ " to " + array.getJSONObject(j).getString("endTime")+ " is intersect");System.out.println("\n");}}}}/*** @param start1 第一個數據開始時間* @param end1 第一個數據結束時間* @param start2 第二個數據開始時間* @param end2 第二個數據結束時間* @return true:發生重疊 false:未發生重疊*/public static boolean isIntersect(long start1, long end1, long start2, long end2) {return Math.max(start1, start2) < Math.min(end1, end2);}@SneakyThrowspublic static long handleDate(String str) {SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");return sdf.parse(str).getTime();}
看一下測試結果
總結
實際很簡單,就是把需要校驗的數據兩兩比較就可以了,總體思想就是把數據轉為數值類型,然后進行比較就可以了。如果對你有幫助,記得點個關注哈~