使用Java判定一個數(shù)值是否在指定的開閉區(qū)間范圍內(nèi)
引言
對于開閉區(qū)間,在數(shù)學(xué)中的表示方式通常為 () 和 [],小括號代表開放區(qū)間,中括號代表封閉區(qū)間,而它們的區(qū)別主要在于是否包含 = 等于號,開閉區(qū)間通常會分為以下一些情形:
- (1, 10):代表 1 < x < 10;
- (1, 10]:代表 1 < x <= 10;
- [1, 10]:代表 1 <= x <= 10;
- [1, 10):代表 1 <= x < 10;
- (1, ) 或 (1, ]:代表 x > 1;
- [1, ] 或 [1, ):代表 x >= 1;
- (, 10) 或 [, 10):代表 x < 10;
- (, 10] 或 [, 10]:代表 x <= 10;
那么如何使用Java來判定一個數(shù)值是否在指定的開閉區(qū)間范圍內(nèi)呢?可以按照以下的思路去實現(xiàn):
- 由于開閉區(qū)間是有一定規(guī)則的,所以開閉區(qū)間必須是合法的,除了(、)、[、]、, 、數(shù)字 之外,其他的字符都是不合法的,所以首先需要校驗開閉區(qū)間的合法性;
- 判定開閉區(qū)間合法后,再拆分出開閉區(qū)間的最小值和最大值;
- 根據(jù)開閉區(qū)間是否包含[],從而在判斷時看是否需要添加 = 號;
1、開閉區(qū)間的合法性校驗
開閉區(qū)間的合法性可以通過正則表達(dá)式進行驗證,具體正則表達(dá)式如下:
/**
* 開閉區(qū)間正則表達(dá)式
*/
private static final Pattern NUM_RANGE_PATTERN = Pattern.compile("[\\[|\\(]\\s?\\d+\\s?,\\s?\\d+\\s?[\\)|\\]]");左半開閉區(qū)間的合法性正則表達(dá)式如下:
/**
* 左半?yún)^(qū)間正則表達(dá)式
*/
private static final Pattern LEFT_NUM_RANGE_PATTERN = Pattern.compile("[\\[|\\(]\\s?\\d+\\s?,\\s?[\\)|\\]]");右半開閉區(qū)間的合法性正則表達(dá)式如下:
/**
* 右半?yún)^(qū)間正則表達(dá)式
*/
private static final Pattern RIGHT_NUM_RANGE_PATTERN = Pattern.compile("[\\[|\\(],\\s?\\d+\\s?[\\)|\\]]");判斷開閉區(qū)間的函數(shù)方法代碼如下:
/**
* 判斷是否為有效的數(shù)字區(qū)間范圍
* @param numRange 數(shù)字區(qū)間
* @return boolean
*/
public static boolean isValidNumRange(String numRange) {
return NUM_RANGE_PATTERN.matcher(numRange).matches()
|| LEFT_NUM_RANGE_PATTERN.matcher(numRange).matches()
|| RIGHT_NUM_RANGE_PATTERN.matcher(numRange).matches();
}2、判定方法
/**
* 判斷數(shù)值是否在區(qū)間范圍內(nèi)
* @param number 數(shù)值
* @param numRange 開閉區(qū)間
* @return boolean
*/
public static boolean inNumRange(int number, String numRange) {
Objects.requireNonNull(numRange);
if (!isValidNumRange(numRange)) {
return false;
}
String[] pairs = numRange.split(",");
// 獲取開閉區(qū)間的最小值和最大值
List<String> rangeNums = Arrays.stream(pairs).map(str -> str.replaceAll("[(|)|\\[|\\]]", "").trim()).collect(Collectors.toList());
Integer minValue = "".equals(rangeNums.get(0)) ? null : Integer.valueOf(rangeNums.get(0));
Integer maxValue = "".equals(rangeNums.get(1)) ? null : Integer.valueOf(rangeNums.get(1));
// 判定數(shù)值是否大于最小值
boolean minMatched = (minValue == null) || (pairs[0].startsWith("[") ? number >= minValue : number > minValue);
// 判定數(shù)值是否小于最大值
boolean maxMatched = (maxValue == null) || (pairs[1].endsWith("]") ? number <= maxValue : number < maxValue);
return minMatched && maxMatched;
}3、測試驗證
public static void main(String[] args) {
System.out.println(inNumRange(1, "(0, 2]"));
System.out.println(inNumRange(1, "(, 2]"));
System.out.println(inNumRange(1, "(1, 4]"));
System.out.println(inNumRange(1, "(0, ]"));
}運行程序,輸出如下結(jié)果:
true
true
false
true
總結(jié)
到此這篇關(guān)于使用Java判定一個數(shù)值是否在指定的開閉區(qū)間范圍內(nèi)的文章就介紹到這了,更多相關(guān)Java判定數(shù)值在開閉區(qū)間范圍內(nèi)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot + WebSocket 實現(xiàn)答題對戰(zhàn)匹配機制案例詳解
這篇文章主要介紹了SpringBoot + WebSocket 實現(xiàn)答題對戰(zhàn)匹配機制,分別為每個用戶擬定四種在線狀態(tài),通過流程圖給大家展示,需要的朋友可以參考下2021-05-05
詳解Mybatis攔截器安全加解密MySQL數(shù)據(jù)實戰(zhàn)
本文主要介紹了Mybatis攔截器安全加解密MySQL數(shù)據(jù)實戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
Java+Selenium調(diào)用JavaScript的方法詳解
這篇文章主要為大家講解了java在利用Selenium操作瀏覽器網(wǎng)站時候,有時會需要用的JavaScript的地方,代碼該如何實現(xiàn)呢?快跟隨小編一起學(xué)習(xí)一下吧2023-01-01
Java中通過三級緩存解決Spring循環(huán)依賴詳解
這篇文章主要介紹了Java中通過三級緩存解決Spring循環(huán)依賴詳解,當(dāng)出現(xiàn)兩個或多個 Bean 在初始化時相互依賴的情況時,Spring Boot 會將其中一個 Bean 提前暴露出來,以便其他 Bean 能夠在初始化時正確地引用它,這一策略能有效避免循環(huán)依賴導(dǎo)致的問題,需要的朋友可以參考下2023-09-09
SpringBoot+slf4j線程池全鏈路調(diào)用日志跟蹤問題及解決思路(二)
本文主要給大家介紹如何實現(xiàn)子線程中的traceId日志跟蹤,本文通過封裝Callable為例給大家介紹的非常詳細(xì),需要的朋友一起看看吧2021-05-05

