首頁 > 軟體

使用Java判定一個數值是否在指定的開閉區間範圍內

2022-09-02 18:02:17

引言

對於開閉區間,在數學中的表示方式通常為 () 和 [],小括號代表開放區間,中括號代表封閉區間,而它們的區別主要在於是否包含 = 等於號,開閉區間通常會分為以下一些情形:

  • (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

總結

到此這篇關於使用Java判定一個數值是否在指定的開閉區間範圍內的文章就介紹到這了,更多相關Java判定數值在開閉區間範圍內內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com