Java判斷范圍型的數(shù)據(jù)是否存在重疊的方法
為什么寫這么一篇文章呢?
遇到了個(gè)問題,同一天可以輸入多個(gè)時(shí)間段,但是每個(gè)時(shí)間段的時(shí)間不能出現(xiàn)重疊。
納尼,這不就是判斷數(shù)據(jù)返回是否有重疊的變種嘛~
簡(jiǎn)單,開搞
數(shù)字范圍是否重疊判斷
這里以int類型為例了,其它的也都類似
核心方法
/**
* @param start1 第一個(gè)數(shù)據(jù)開始時(shí)間
* @param end1 第一個(gè)數(shù)據(jù)結(jié)束時(shí)間
* @param start2 第二個(gè)數(shù)據(jù)開始時(shí)間
* @param end2 第二個(gè)數(shù)據(jù)結(jié)束時(shí)間
* @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個(gè)參數(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的效果把=去掉即可,后面會(huì)有演示。
核心方法非常簡(jiǎn)單,那我們?cè)煲唤M偽數(shù)據(jù)測(cè)試一下吧。
測(cè)試數(shù)據(jù)
先來一組錯(cuò)誤數(shù)據(jù)吧
[
{"startNum": 0, "endNum": 100},
{"startNum": 100, "endNum": 500},
{"startNum": 400, "endNum": 1000},
{"startNum": 1001, "endNum": 9999}
]
測(cè)試方法
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ù)值類的都類似哈
時(shí)間范圍是否重疊判斷
時(shí)間有很多種,我們一種一種的來說,實(shí)現(xiàn)都一樣,重要的是思想
首先來看一下下面這種格式,搞個(gè)錯(cuò)誤數(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"}
]
因?yàn)?code>01:00是重疊的,所以我們把上面核心方法的=去掉。如下
/**
* @param start1 第一個(gè)數(shù)據(jù)開始時(shí)間
* @param end1 第一個(gè)數(shù)據(jù)結(jié)束時(shí)間
* @param start2 第二個(gè)數(shù)據(jù)開始時(shí)間
* @param end2 第二個(gè)數(shù)據(jù)結(jié)束時(shí)間
* @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);
}
接下來就很簡(jiǎn)單了,把時(shí)間處理成數(shù)據(jù)類型就可以了,下面看一下處理的方法
public static int handleStr(String str) {
str = str.replace(":", "");
return Integer.parseInt(str);
}
來一起看一下運(yùn)行結(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");
}
}
}
}

對(duì)于時(shí)間類型,下面格式如何比較
[
{"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"}
]
其實(shí)直接將時(shí)間轉(zhuǎn)為時(shí)間戳來比較就可以了,完整代碼如下:
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 第一個(gè)數(shù)據(jù)開始時(shí)間
* @param end1 第一個(gè)數(shù)據(jù)結(jié)束時(shí)間
* @param start2 第二個(gè)數(shù)據(jù)開始時(shí)間
* @param end2 第二個(gè)數(shù)據(jù)結(jié)束時(shí)間
* @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();
}
看一下測(cè)試結(jié)果

總結(jié)
到此這篇關(guān)于Java判斷范圍型的數(shù)據(jù)是否存在重疊的方法的文章就介紹到這了,更多相關(guān)Java判斷數(shù)據(jù)是否重疊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot實(shí)現(xiàn)公眾號(hào)接收回復(fù)消息和超過5秒被動(dòng)回復(fù)消息
本文主要介紹了springboot實(shí)現(xiàn)公眾號(hào)接收回復(fù)消息和超過5秒被動(dòng)回復(fù)消息,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
詳解將Eclipse代碼導(dǎo)入到AndroidStudio的兩種方式
本篇文章主要介紹了詳解將Eclipse代碼導(dǎo)入到AndroidStudio的兩種方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
非常實(shí)用的java自動(dòng)答題計(jì)時(shí)計(jì)分器
這篇文章主要為大家詳細(xì)介紹了非常實(shí)用的java自動(dòng)答題計(jì)時(shí)計(jì)分器的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
@Scheduled注解不能同時(shí)執(zhí)行多個(gè)定時(shí)任務(wù)的解決方案
這篇文章主要介紹了@Scheduled注解不能同時(shí)執(zhí)行多個(gè)定時(shí)任務(wù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
Spring源碼之事件監(jiān)聽機(jī)制詳解(@EventListener實(shí)現(xiàn)方式)
這篇文章主要介紹了Spring源碼之事件監(jiān)聽機(jī)制(@EventListener實(shí)現(xiàn)方式),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08

