使用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ū)間的合法性可以通過正則表達式進行驗證,具體正則表達式如下:
/**
* 開閉區(qū)間正則表達式
*/
private static final Pattern NUM_RANGE_PATTERN = Pattern.compile("[\\[|\\(]\\s?\\d+\\s?,\\s?\\d+\\s?[\\)|\\]]");左半開閉區(qū)間的合法性正則表達式如下:
/**
* 左半?yún)^(qū)間正則表達式
*/
private static final Pattern LEFT_NUM_RANGE_PATTERN = Pattern.compile("[\\[|\\(]\\s?\\d+\\s?,\\s?[\\)|\\]]");右半開閉區(qū)間的合法性正則表達式如下:
/**
* 右半?yún)^(qū)間正則表達式
*/
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)文章
生產(chǎn)環(huán)境NoHttpResponseException異常排查解決記錄分析
這篇文章主要為大家介紹了生產(chǎn)環(huán)境NoHttpResponseException異常排查解決記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10
OpenJDK源碼解析之System.out.println詳解
這篇文章主要介紹了OpenJDK源碼解析之System.out.println詳解,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
SpringCloud Gateway動態(tài)轉(zhuǎn)發(fā)后端服務(wù)實現(xiàn)過程講解
這篇文章主要介紹了SpringCloud Gateway動態(tài)轉(zhuǎn)發(fā)后端服務(wù)實現(xiàn)過程,簡單的路由轉(zhuǎn)發(fā)可以通過SpringCloudGateway的配置文件實現(xiàn),在一些業(yè)務(wù)場景種,會需要動態(tài)替換路由配置中的后端服務(wù)地址,單純靠配置文件無法滿足這種需求2023-03-03
SpringBoot中MyBatis-Plus 查詢時排除某些字段的操作方法
這篇文章主要介紹了SpringBoot中MyBatis-Plus 查詢時排除某些字段的操作方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08

