Java如何確定兩個區(qū)間范圍是否有交集
問題背景
日常工作項(xiàng)目中可能會遇到類似的針對兩個及以上的區(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 cloud gateway(總結(jié)篇)
Spring Cloud Gateway是Spring Cloud的全新項(xiàng)目,該項(xiàng)目是基于Spring 5.0,Spring WebFlux和Project Reactor等技術(shù)開發(fā)的網(wǎng)關(guān),它旨在為微服務(wù)架構(gòu)提供一種簡單有效的統(tǒng)一的API路由管理方式,本文通過實(shí)例代碼總結(jié)介紹spring cloud gateway的相關(guān)知識,感興趣的朋友一起看看吧2024-12-12
SpringBoot AOP處理請求日志打印功能代碼實(shí)例
這篇文章主要介紹了SpringBoot AOP處理請求日志打印功能代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
Spring Boot中日志管理與異常處理實(shí)踐指南
本文系統(tǒng)化講解SpringBoot日志管理與異常處理,涵蓋Logback配置、分層異常處理、上下文記錄及ELK集成,強(qiáng)調(diào)日志分級、自定義異常設(shè)計(jì),增強(qiáng)應(yīng)用穩(wěn)定性與可維護(hù)性,感興趣的朋友跟隨小編一起看看吧2025-06-06
SpringCloud微服務(wù)熔斷器Hystrix使用詳解
這篇文章主要介紹了Spring Cloud Hyxtrix的基本使用,它是Spring Cloud中集成的一個組件,在整個生態(tài)中主要為我們提供服務(wù)隔離,服務(wù)熔斷,服務(wù)降級功能,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
Java利用正則取標(biāo)簽之間的數(shù)據(jù)
這篇文章主要介紹了Java利用正則取標(biāo)簽之間的數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
Spring核心IoC容器的依賴注入接口和層級包命名規(guī)范
這篇文章主要介紹了Spring核心IoC容器的依賴注入接口和層級包命名規(guī)范,IOC又名控制反轉(zhuǎn),把對象創(chuàng)建和對象之間的調(diào)用過程,交給Spring進(jìn)行管理,目的是為了降低耦合度,需要的朋友可以參考下2023-05-05

