Java如何確定兩個區(qū)間范圍是否有交集
問題背景
日常工作項目中可能會遇到類似的針對兩個及以上的區(qū)間范圍來判斷是否有交集的場景;
可能是兩個日期時間段、地點距離區(qū)間、金額范圍區(qū)間等等。
第一次遇到難免會覺得兩個區(qū)間的可能性比較多,使用一一窮舉的方式顯然不行的, 這時候不妨換一種思路來思考就簡單清晰多了。
思路分析
如果首先考慮相交的情況是比較的,這個時候需要反其道而行,即考慮不相交的情況就相對簡單多了;
其實不相交的情況就兩種:
- 兩者不連續(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
總結結論
由以上思路分析得出如果兩個區(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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Spring Security6 最新版配置及實現(xiàn)動態(tài)權限管理
Spring Security 在最近幾個版本中配置的寫法都有一些變化,很多常見的方法都廢棄了,并且將在未來的 Spring Security7 中移除,因此又補充了一些新的內(nèi)容,重新發(fā)一下,供各位使用 Spring Security 的小伙伴們參考,需要的朋友可以參考下2024-03-03JAVA編程實現(xiàn)UDP網(wǎng)絡通訊的方法示例
這篇文章主要介紹了JAVA編程實現(xiàn)UDP網(wǎng)絡通訊的方法,簡單說明了UDP通訊的原理并結合實例形式分析了java實現(xiàn)UDP通訊的相關類與使用技巧,需要的朋友可以參考下2017-08-08