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ū)域之前,那么它們必須重疊。)
根據摩根定律可得出:
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;
}
}最后
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Spring Security6 最新版配置及實現動態(tài)權限管理
Spring Security 在最近幾個版本中配置的寫法都有一些變化,很多常見的方法都廢棄了,并且將在未來的 Spring Security7 中移除,因此又補充了一些新的內容,重新發(fā)一下,供各位使用 Spring Security 的小伙伴們參考,需要的朋友可以參考下2024-03-03

