對于開閉區間,在數學中的表示方式通常為 () 和 [],小括號代表開放區間,中括號代表封閉區間,而它們的區別主要在于是否包含 = 等于號,開閉區間通常會分為以下一些情形:
- (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來判定一個數值是否在指定的開閉區間范圍內呢?可以按照以下的思路去實作:
- 由于開閉區間是有一定規則的,所以開閉區間必須是合法的,除了(、)、[、]、, 、數字 之外,其他的字符都是不合法的,所以首先需要校驗開閉區間的合法性;
- 判定開閉區間合法后,再拆分出開閉區間的最小值和最大值;
- 根據開閉區間是否包含[],從而在判斷時看是否需要添加 = 號;
1、開閉區間的合法性校驗
開閉區間的合法性可以通過正則運算式進行驗證,具體正則運算式如下:
/**
* 開閉區間正則運算式
*/
private static final Pattern NUM_RANGE_PATTERN = Pattern.compile("[\\[|\\(]\\s?\\d+\\s?,\\s?\\d+\\s?[\\)|\\]]");
左半開閉區間的合法性正則運算式如下:
/**
* 左半區間正則運算式
*/
private static final Pattern LEFT_NUM_RANGE_PATTERN = Pattern.compile("[\\[|\\(]\\s?\\d+\\s?,\\s?[\\)|\\]]");
右半開閉區間的合法性正則運算式如下:
/**
* 右半區間正則運算式
*/
private static final Pattern RIGHT_NUM_RANGE_PATTERN = Pattern.compile("[\\[|\\(],\\s?\\d+\\s?[\\)|\\]]");
判斷開閉區間的函式方法代碼如下:
/**
* 判斷是否為有效的數字區間范圍
* @param numRange 數字區間
* @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、判定方法
/**
* 判斷數值是否在區間范圍內
* @param number 數值
* @param numRange 開閉區間
* @return boolean
*/
public static boolean inNumRange(int number, String numRange) {
Objects.requireNonNull(numRange);
if (!isValidNumRange(numRange)) {
return false;
}
String[] pairs = numRange.split(",");
// 獲取開閉區間的最小值和最大值
List<String> rangeNums = Arrays.stream(pairs).map(str -> str.replaceAll("[(|)|\\[|\\]]", "").trim()).collect(Collectors.toList());
Integer minValuehttps://www.cnblogs.com/javatop/archive/2022/07/24/= "".equals(rangeNums.get(0)) ? null : Integer.valueOf(rangeNums.get(0));
Integer maxValuehttps://www.cnblogs.com/javatop/archive/2022/07/24/= "".equals(rangeNums.get(1)) ? null : Integer.valueOf(rangeNums.get(1));
// 判定數值是否大于最小值
boolean minMatched = (minValue =https://www.cnblogs.com/javatop/archive/2022/07/24/= null) || (pairs[0].startsWith("[") ? number >= minValue : number > minValue);
// 判定數值是否小于最大值
boolean maxMatched = (maxValue =https://www.cnblogs.com/javatop/archive/2022/07/24/= 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, ]"));
}
運行程式,輸出如下結果:
true
true
false
true
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/500178.html
標籤:其他
上一篇:Python詞頻分析
