使用Java判定一个数值是否在指定的开闭区间范围内

 更新时间:2022年09月02日 11:32:02   作者:十方  
这篇文章主要给大家介绍了关于使用Java判定一个数值是否在指定的开闭区间范围内的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友可以参考下

引言

对于开闭区间,在数学中的表示方式通常为 () 和 [],小括号代表开放区间,中括号代表封闭区间,而它们的区别主要在于是否包含 = 等于号,开闭区间通常会分为以下一些情形:

  • (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判定数值在开闭区间范围内内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决Java项目中request流只能获取一次的问题

    解决Java项目中request流只能获取一次的问题

    Java项目开发中可能存在以下几种情况,你需要在拦截器中统一拦截请求和你项目里可能需要搞一个统一的异常处理器,这两种情况是比较常见的,本文将给大家介绍如何解决Java项目中request流只能获取一次的问题,需要的朋友可以参考下
    2024-02-02
  • 深入理解Java设计模式之备忘录模式

    深入理解Java设计模式之备忘录模式

    这篇文章主要介绍了JAVA设计模式之备忘录模式的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解
    2021-11-11
  • SpringBoot + WebSocket 实现答题对战匹配机制案例详解

    SpringBoot + WebSocket 实现答题对战匹配机制案例详解

    这篇文章主要介绍了SpringBoot + WebSocket 实现答题对战匹配机制,分别为每个用户拟定四种在线状态,通过流程图给大家展示,需要的朋友可以参考下
    2021-05-05
  • 详解Mybatis拦截器安全加解密MySQL数据实战

    详解Mybatis拦截器安全加解密MySQL数据实战

    本文主要介绍了Mybatis拦截器安全加解密MySQL数据实战,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Java+Selenium调用JavaScript的方法详解

    Java+Selenium调用JavaScript的方法详解

    这篇文章主要为大家讲解了java在利用Selenium操作浏览器网站时候,有时会需要用的JavaScript的地方,代码该如何实现呢?快跟随小编一起学习一下吧
    2023-01-01
  • Java中通过三级缓存解决Spring循环依赖详解

    Java中通过三级缓存解决Spring循环依赖详解

    这篇文章主要介绍了Java中通过三级缓存解决Spring循环依赖详解,当出现两个或多个 Bean 在初始化时相互依赖的情况时,Spring Boot 会将其中一个 Bean 提前暴露出来,以便其他 Bean 能够在初始化时正确地引用它,这一策略能有效避免循环依赖导致的问题,需要的朋友可以参考下
    2023-09-09
  • 详解Spring MVC自动为对象注入枚举类型

    详解Spring MVC自动为对象注入枚举类型

    本篇文章主要介绍了Spring MVC自动为对象注入枚举类型,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • 基于Java随机生成手机短信验证码的实例代码

    基于Java随机生成手机短信验证码的实例代码

    这篇文章主要介绍了Java随机生成手机短信验证码的实例代码,代码分为哦简单版和复杂版,需要的朋友可以参考下
    2019-04-04
  • Redis缓存策略超详细讲解

    Redis缓存策略超详细讲解

    实际开发中缓存处理是必须的,不可能我们每次客户端去请求一次服务器,服务器每次都要去数据库中进行查找,为什么要使用缓存?说到底是为了提高系统的运行速度
    2022-09-09
  • SpringBoot+slf4j线程池全链路调用日志跟踪问题及解决思路(二)

    SpringBoot+slf4j线程池全链路调用日志跟踪问题及解决思路(二)

    本文主要给大家介绍如何实现子线程中的traceId日志跟踪,本文通过封装Callable为例给大家介绍的非常详细,需要的朋友一起看看吧
    2021-05-05

最新评论