Java判斷范圍型的數(shù)據(jù)是否存在重疊的方法
為什么寫這么一篇文章呢?
遇到了個問題,同一天可以輸入多個時間段,但是每個時間段的時間不能出現(xiàn)重疊。
納尼,這不就是判斷數(shù)據(jù)返回是否有重疊的變種嘛~
簡單,開搞
數(shù)字范圍是否重疊判斷
這里以int類型為例了,其它的也都類似
核心方法
/**
* @param start1 第一個數(shù)據(jù)開始時間
* @param end1 第一個數(shù)據(jù)結(jié)束時間
* @param start2 第二個數(shù)據(jù)開始時間
* @param end2 第二個數(shù)據(jù)結(jié)束時間
* @return true:發(fā)生重疊 false:未發(fā)生重疊
*/
public static boolean isIntersect(int start1, int end1, int start2, int end2) {
return Math.max(start1, start2) <= Math.min(end1, end2);
}
4個參數(shù)start1-end1代表第一組范圍,start2-end2代表第二組范圍;
Math.max(start1, start2) <= Math.min(end1, end2)使用Math.max和Math.min可以無視第一組數(shù)據(jù)和第二組數(shù)據(jù)的順序,只比較是否重疊,<= 代表0-1后面不能是1-3,只能是2-3;如果想要1-3的效果把=去掉即可,后面會有演示。
核心方法非常簡單,那我們造一組偽數(shù)據(jù)測試一下吧。
測試數(shù)據(jù)
先來一組錯誤數(shù)據(jù)吧
[
{"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");
}
}
}
}
答案還是很清晰的哈~

數(shù)字范圍效果完成了。數(shù)值類的都類似哈
時間范圍是否重疊判斷
時間有很多種,我們一種一種的來說,實現(xiàn)都一樣,重要的是思想
首先來看一下下面這種格式,搞個錯誤數(shù)據(jù)吧
[
{"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 第一個數(shù)據(jù)開始時間
* @param end1 第一個數(shù)據(jù)結(jié)束時間
* @param start2 第二個數(shù)據(jù)開始時間
* @param end2 第二個數(shù)據(jù)結(jié)束時間
* @return true:發(fā)生重疊 false:未發(fā)生重疊
*/
public static boolean isIntersect(int start1, int end1, int start2, int end2) {
return Math.max(start1, start2) < Math.min(end1, end2);
}
接下來就很簡單了,把時間處理成數(shù)據(jù)類型就可以了,下面看一下處理的方法
public static int handleStr(String str) {
str = str.replace(":", "");
return Integer.parseInt(str);
}
來一起看一下運行結(jié)果吧
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"}
]
其實直接將時間轉(zhuǎn)為時間戳來比較就可以了,完整代碼如下:
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 第一個數(shù)據(jù)開始時間
* @param end1 第一個數(shù)據(jù)結(jié)束時間
* @param start2 第二個數(shù)據(jù)開始時間
* @param end2 第二個數(shù)據(jù)結(jié)束時間
* @return true:發(fā)生重疊 false:未發(fā)生重疊
*/
public static boolean isIntersect(long start1, long end1, long start2, long end2) {
return Math.max(start1, start2) < Math.min(end1, end2);
}
@SneakyThrows
public static long handleDate(String str) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
return sdf.parse(str).getTime();
}
看一下測試結(jié)果

總結(jié)
到此這篇關(guān)于Java判斷范圍型的數(shù)據(jù)是否存在重疊的方法的文章就介紹到這了,更多相關(guān)Java判斷數(shù)據(jù)是否重疊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java多線程之循環(huán)柵欄技術(shù)CyclicBarrier使用探索
這篇文章主要介紹了Java多線程之循環(huán)柵欄技術(shù)CyclicBarrier,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2024-01-01
簡單談?wù)凷truts動態(tài)表單(DynamicForm)
下面小編就為大家?guī)硪黄唵握務(wù)凷truts動態(tài)表單(DynamicForm)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08
IntelliJ?IDEA?代碼運行時中文出現(xiàn)亂碼問題及解決方法
在我們剛接觸到IDEA時,想美滋滋的敲一個“hello?world”來問候這個世界,但難免會遇到這種問題亂碼,這篇文章主要介紹了解決IntelliJ?IDEA?代碼運行時中文出現(xiàn)亂碼問題,需要的朋友可以參考下2023-09-09
Java中的runnable 和 callable 區(qū)別解析
Runnable接口用于定義不需要返回結(jié)果的任務(wù),而Callable接口可以返回結(jié)果并拋出異常,通常與Future結(jié)合使用,Runnable適用于簡單的后臺任務(wù)和定時任務(wù),而Callable適用于并行計算、異步操作和復(fù)雜任務(wù),選擇使用哪個接口取決于具體的應(yīng)用場景,感興趣的朋友一起看看吧2025-03-03
java web中的servlet3 upload上傳文件實踐
這篇文章主要介紹了servlet3 upload上傳文件實踐,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-11-11
java自定義任務(wù)類定時執(zhí)行任務(wù)示例 callable和future接口使用方法
Callable是類似于Runnable的接口,實現(xiàn)Callable接口的類和實現(xiàn)Runnable的類都是可被其它線程執(zhí)行的任務(wù)2014-01-01

