使用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á)式進(jìn)行驗證,具體正則表達(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)文章
生產(chǎn)環(huán)境NoHttpResponseException異常排查解決記錄分析
這篇文章主要為大家介紹了生產(chǎn)環(huán)境NoHttpResponseException異常排查解決記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10OpenJDK源碼解析之System.out.println詳解
這篇文章主要介紹了OpenJDK源碼解析之System.out.println詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04SpringCloud 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-03SpringBoot中MyBatis-Plus 查詢時排除某些字段的操作方法
這篇文章主要介紹了SpringBoot中MyBatis-Plus 查詢時排除某些字段的操作方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08