共计 2136 个字符,预计需要花费 6 分钟才能阅读完成。
对于开闭区间,在数学中的示意形式通常为 () 和 [],小括号代表凋谢区间,中括号代表关闭区间,而它们的区别次要在于是否蕴含 = 等于号,开闭区间通常会分为以下一些情景:
- (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 minValue = "".equals(rangeNums.get(0)) ? null : Integer.valueOf(rangeNums.get(0));
Integer maxValue = "".equals(rangeNums.get(1)) ? null : Integer.valueOf(rangeNums.get(1));
// 断定数值是否大于最小值
boolean minMatched = (minValue == null) || (pairs[0].startsWith("[") ? number >= minValue : number > minValue);
// 断定数值是否小于最大值
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,]"));
}
运行程序,输入如下后果:
true
true
false
true
正文完