所以我有一个字符串,指定了有效的数字范围。
例如。
String range = "100-200 , 500 , 1000-1200";
需要检查给定的整数值是否在此指定范围内 范围每次都不同。
答案 0 :(得分:1)
您应该首先分隔不同的范围。有效范围似乎是用逗号分隔的,因此您需要用,
分开。
String[] ranges = range.split(" , ");
然后对于每个范围,您都需要将其用连字符分隔。作为Stultuske pointed out,您必须考虑到连字符本身可以是整数符号的一部分的事实。如果只期望正值,则可以用单个连字符分开:
String rangeStr = "400-600";
String parts = rangeStr.split("-");
或者,如果期望也为负值,则应按不在字符串开头的第一个连字符进行拆分,并仅应用一次拆分。
String rangeStr = "-1200--1000";
// Splits by hyphen which is not preceded by the start of the string.
// The resulting array has no more than two elements
String[] parts = rangeStr.split("(?<!^)-", 2);
请注意,如果仅给出一个值而不是一个范围(例如, 500
。那么,当然parts.length
是1
。
然后您可以通过调用Integer.valueOf(...)
来获取整数。
这是包装在静态方法中的代码:
public static boolean inRange(String range, int value) {
return Arrays.stream(range.split(" , "))
.anyMatch(t -> {
// Split the two integers denoting the range. The length of the
// array is 1 if the range is an exact value (500 in your case),
// otherwise, its length is 2
String[] parts = t.split("(?<!^)-", 2);
int minVal = Integer.valueOf(parts[0]);
int maxVal = (parts.length == 2 ? Integer.valueOf(parts[1]) : minVal);
return (minVal <= value && value <= maxVal);
});
}
}
下面是一些测试:
String range = "-2100--2000, 100-200, 500, 1000-1200, 2000-2100";
System.out.println(inRange(range, -2150)); // false
System.out.println(inRange(range, -2000)); // true
System.out.println(inRange(range, 400)); // false
System.out.println(inRange(range, 500)); // true
System.out.println(inRange(range, 1100)); // true
请注意,我假设源字符串的格式正确。如果您想更宽容所期望的源字符串(例如,中间的多个空格的尾部空格),则必须自己实现。