Java如何確定兩個區(qū)間范圍是否有交集
問題背景
日常工作項目中可能會遇到類似的針對兩個及以上的區(qū)間范圍來判斷是否有交集的場景;
可能是兩個日期時間段、地點(diǎn)距離區(qū)間、金額范圍區(qū)間等等。
第一次遇到難免會覺得兩個區(qū)間的可能性比較多,使用一一窮舉的方式顯然不行的, 這時候不妨換一種思路來思考就簡單清晰多了。
思路分析
如果首先考慮相交的情況是比較的,這個時候需要反其道而行,即考慮不相交的情況就相對簡單多了;
其實(shí)不相交的情況就兩種:
- 兩者不連續(xù),區(qū)間1的范圍完全在區(qū)間2的范圍之前
- 兩者不連續(xù),區(qū)間1的范圍完全在區(qū)間2的范圍之后
圖示如下:
情況A:如果成立,則必定有 EndRange1 < StartRange2
情況B:如果成立,則必定有 EndRange2 < StartRange1
綜上兩種情況可以得出:如果情況A或者情況B都不成立,則重疊必定存在 (如果一個區(qū)域既不是完全在另一個區(qū)域之后,也不是完全在另一個區(qū)域之前,那么它們必須重疊。)
根據(jù)摩根定律可得出:
Not (A Or B)
<=> Not A And Not B
總結(jié)結(jié)論
由以上思路分析得出如果兩個區(qū)間范圍相交(重疊),則必定存在 (StartA <= EndB) and (EndA >= StartB);
他的包含條件是邊完全相交(重疊)。
如果希望排除情況,請將>=操作符更改為>,將<=操作符更改為<
代碼示例
@Test public void test01() { Double[] a = new Double[]{90D, Double.MAX_VALUE}; Double[] b = new Double[]{10D, 90D}; a = new Double[]{0D, 10D}; boolean overlap = isIntervalOverlap(a, b); if (overlap) { System.out.println("相交"); } else { System.out.println("不相交"); } } private static boolean isIntervalOverlap(Double[] inrA, Double[] inrB) { if (inrA.length < 2 || inrB.length < 2) { throw new RuntimeException("區(qū)間范圍必須包含兩個值以上"); } Arrays.sort(inrA); Arrays.sort(inrB); // (StartA <= EndB) and (EndA >= StartB) if (inrA[0] < inrB[inrB.length - 1] && inrA[inrA.length - 1] > inrB[0]) { return true; } else { return false; } }
最后
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Security6 最新版配置及實(shí)現(xiàn)動態(tài)權(quán)限管理
Spring Security 在最近幾個版本中配置的寫法都有一些變化,很多常見的方法都廢棄了,并且將在未來的 Spring Security7 中移除,因此又補(bǔ)充了一些新的內(nèi)容,重新發(fā)一下,供各位使用 Spring Security 的小伙伴們參考,需要的朋友可以參考下2024-03-03Spring Cache擴(kuò)展功能實(shí)現(xiàn)過程解析
這篇文章主要介紹了Spring Cache擴(kuò)展功能實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02Java利用cors實(shí)現(xiàn)跨域請求實(shí)例
本篇文章主要介紹了Java利用cors實(shí)現(xiàn)跨域請求實(shí)例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05Springboot項目快速實(shí)現(xiàn)Aop功能
這篇文章主要介紹了Springboot項目如何快速實(shí)現(xiàn)Aop功能,對此方面感興趣的小伙伴可以詳細(xì)參考閱讀本文,本文有一定的參考價值2023-03-03JAVA編程實(shí)現(xiàn)UDP網(wǎng)絡(luò)通訊的方法示例
這篇文章主要介紹了JAVA編程實(shí)現(xiàn)UDP網(wǎng)絡(luò)通訊的方法,簡單說明了UDP通訊的原理并結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)UDP通訊的相關(guān)類與使用技巧,需要的朋友可以參考下2017-08-08