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

目录
  • 引言
  • 1、开闭区间的合法性校验
  • 2、判定方法
  • 3、测试验证
  • 总结

引言

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

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

(0)

相关推荐

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

    目录 引言 1.开闭区间的合法性校验 2.判定方法 3.测试验证 总结 引言 对于开闭区间,在数学中的表示方式通常为 () 和 [],小括号代表开放区间,中括号代表封闭区间,而它们的区别主要在于是否包含 = 等于号,开闭区间通常会分为以下一些情形: (1, 10):代表 1 < x < 10: (1, 10]:代表 1 < x <= 10: [1, 10]:代表 1 <= x <= 10: [1, 10):代表 1 <= x < 10: (1, ) 或 (1

  • java 判断一个数组中的数值是否连续相邻的方法

    * 判断一个数组中的数值是否连续相邻 * 满足以下条件: * 1.0是例外可以反复出现 0可以通配任何字符 * 2.相同的数值不会重复出现 * 3.该数组可以是乱序的 * 当数组不含有0时满足最大值-最小值=n(数组长度)-1 * 当数组数组含有0时.满足最大值-最小值<n(数组长度)-1 * 所以,当最大值最大值-最小值>n(数组长度)-1时,一定不是连续相邻数组 package datastruct.usearray; public class JudgeAdjacent { privat

  • Java获得一个数组的指定长度排列组合算法示例

    本文实例讲述了Java获得一个数组的指定长度排列组合算法.分享给大家供大家参考,具体如下: package demo; import java.util.Stack; /** * JAVA获得一个数组的指定长度的排列组合.<br> * * @author JAVA世纪网(java2000.net, laozizhu.com) */ public class TestSequenceAll { public static void main(String[] args) { TestSequen

  • 基于Java编写一个简单的风控组件

    目录 一.背景 1.为什么要做风控 2.为什么要自己写风控 3.其它要求 二.思路 1.风控规则的实现 2.调用方式的实现 三.具体实现 1.风控计数规则实现 2.注解的实现 四.测试一下 1.写法 2.Debug看看 一.背景 1.为什么要做风控 这不得拜产品大佬所赐 目前我们业务有使用到非常多的AI能力,如ocr识别.语音测评等,这些能力往往都比较费钱或者费资源,所以在产品层面也希望我们对用户的能力使用次数做一定的限制,因此风控是必须的! 2.为什么要自己写风控 那么多开源的风控组件,为什么

  • 基于Java中的数值和集合详解

    数组array和集合的区别: (1) 数值是大小固定的,同一数组只能存放一样的数据. (2) java集合可以存放不固定的一组数据 (3) 若程序事不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用 数组转换为集合: Arrays.asList(数组) 示例: int[] arr = {1,3,4,6,6}; Arrays.asList(arr); for(int i=0;i<arr.length;i++){ System.out.println(arr[

  • java判定数组或集合是否存在某个元素的实例

    引言: 今天群里有朋友问"怎么知道一个数组集合是否已经存在当前对象",大家都知道循环比对,包括我这位大神群友.还有没其他办法呢?且看此篇. 正文: 能找到这里的都是程序员吧,直接上代码应该更清楚些. import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.regex.Matcher; im

  • java日期操作工具类(获取指定日期、日期转换、相隔天数)

    本文实例为大家分享了java日期操作工具类,获取指定日期前一天.后一天:日期转换:两个日期之间相隔天数等工具类,供大家参考,具体内容如下 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; public class

  • java中删除 数组中的指定元素方法

    java中删除 数组中的指定元素要如何来实现呢,如果各位对于这个算法不是很清楚可以和小编一起来看一篇关于java中删除 数组中的指定元素的例子. java的api中,并没有提供删除数组中元素的方法.虽然数组是一个对象,不过并没有提供add().remove()或查找元素的方法.这就是为什么类似ArrayList和HashSet受欢迎的原因. 不过,我们要感谢Apache Commons Utils,我们可以使用这个库的ArrayUtils类来轻易的删除数组中的元素.不过有一点需要注意,数组是在大

  • Java实现一个简单的定时器代码解析

    定时的功能我们在手机上见得比较多,比如定时清理垃圾,闹钟,等等.定时功能在java中主要使用的就是Timer对象,他在内部使用的就是多线程的技术. Time类主要负责完成定时计划任务的功能,就是在指定的时间的开始执行某个任务. Timer类的作用是设置计划任务,而封装任务内容的类是TimerTask类.此类是一个抽象类,继承需要实现一个run方法. 利用java制作定时器比较简单,有现成的接口帮助实现.java中制作定时器使用的是Timer和TimerTask,是util包的.java.util

  • Java编程一个随机数产生模块代码分享

    java随机数的产生比较简单,可以通过 Random rand = new Random(47); System.out.println(rand.nextInt()); 产生,也可以通过以下产生: double d = Math.random(); 当然代码中前者由于使用了固定的种子47,所以每次的值都是一样的,也可以使用 Random rand = new Random(); System.out.println(rand.nextInt()); 而对于代码2则产生的是double的随机数.

随机推荐