区间判断工具类的编写

  • 说明
  • 重点:区间工具类(转载:前行123的博客)
  • 使用

说明

开发中,有这么一个需求,需要根据某些属性值来进行等级判断,并把判断好的结果持久化到数据库中。而这些等级区间的格式是这样的:(这是我设计的oracle表,name就是区间名,value是区间值,rtcode是返回的区间码,levelCode可以根据这个字段进行查找相应的区间,desc是描述)

重点:区间工具类(转载:前行123的博客)

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;/**判断某个值是否在某个区间工具类,返回booblean值*/
public class IntervalUtil {/*** 判断data_value是否在interval区间范围内* @param data_value 数值类型的* @param interval 正常的数学区间,包括无穷大等,如:(1,3)、>5%、(-∞,6]、(125%,135%)U(70%,80%)* @return true:表示data_value在区间interval范围内,false:表示data_value不在区间interval范围内*/public static boolean isInTheInterval(String data_value,String interval) {//将区间和data_value转化为可计算的表达式String formula = getFormulaByAllInterval(data_value,interval,"||");ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");try {//计算表达式return (Boolean) jse.eval(formula);} catch (Exception t) {return false;}}/*** 将所有阀值区间转化为公式:如* [75,80)   =》                   date_value < 80 && date_value >= 75* (125%,135%)U(70%,80%)   =》     (date_value < 1.35 && date_value > 1.25) || (date_value < 0.8 && date_value > 0.7)* @param date_value* @param interval  形式如:(125%,135%)U(70%,80%)* @param connector 连接符 如:") || ("*/private static String getFormulaByAllInterval(String date_value, String interval, String connector) {StringBuffer buff = new StringBuffer();for(String limit:interval.split("U")){//如:(125%,135%)U (70%,80%)buff.append("(").append(getFormulaByInterval(date_value, limit," && ")).append(")").append(connector);}String allLimitInvel = buff.toString();int index = allLimitInvel.lastIndexOf(connector);allLimitInvel = allLimitInvel.substring(0,index);return allLimitInvel;}/*** 将整个阀值区间转化为公式:如* 145)      =》         date_value < 145* [75,80)   =》        date_value < 80 && date_value >= 75* @param date_value* @param interval  形式如:145)、[75,80)* @param connector 连接符 如:&&*/private static String getFormulaByInterval(String date_value, String interval, String connector) {StringBuffer buff = new StringBuffer();for(String halfInterval:interval.split(",")){//如:[75,80)、≥80buff.append(getFormulaByHalfInterval(halfInterval, date_value)).append(connector);}String limitInvel = buff.toString();int index = limitInvel.lastIndexOf(connector);limitInvel = limitInvel.substring(0,index);return limitInvel;}/*** 将半个阀值区间转化为公式:如* 145)      =》         date_value < 145* ≥80%      =》         date_value >= 0.8* [130      =》         date_value >= 130* <80%     =》         date_value < 0.8* @param halfInterval  形式如:145)、≥80%、[130、<80%* @param date_value* @return date_value < 145*/private static String getFormulaByHalfInterval(String halfInterval, String date_value) {halfInterval = halfInterval.trim();if(halfInterval.contains("∞")){//包含无穷大则不需要公式return "1 == 1";}StringBuffer formula = new StringBuffer();String data = "";String opera = "";if(halfInterval.matches("^([<>≤≥\\[\\(]{1}(-?\\d+.?\\d*\\%?))$")){//表示判断方向(如>)在前面 如:≥80%opera = halfInterval.substring(0,1);data = halfInterval.substring(1);}else{//[130、145)opera = halfInterval.substring(halfInterval.length()-1);data = halfInterval.substring(0,halfInterval.length()-1);}double value = dealPercent(data);formula.append(date_value).append(" ").append(opera).append(" ").append(value);String a = formula.toString();//转化特定字符return a.replace("[", ">=").replace("(", ">").replace("]", "<=").replace(")", "<").replace("≤", "<=").replace("≥", ">=");}/*** 去除百分号,转为小数* @param str 可能含百分号的数字* @return*/private static double dealPercent(String str){double d = 0.0;if(str.contains("%")){str = str.substring(0,str.length()-1);d = Double.parseDouble(str)/100;}else{d = Double.parseDouble(str);}return d;}public static void main(String[] args) {System.out.println(IntervalUtil.isInTheInterval("10", "[9,11)"));}
}

使用

直接调用IntervalUtil.isInTheInterval(String data_value,String interval)方法,得到一个booblean值(具体使用请看工具类的注释)
业务代码:

//读取区间
List<LevelBO> durationLevelList = levelMapper.findByLevleCode(CALL_DURATION_LEVELCODE);
//遍历等级判断区间
for (LevelBO levelBO : durationLevelList) {//2.1.2 用区间工具类判断是否在查找出的区间集合中if (!IntervalUtil.isInTheInterval(String.valueOf(time), levelBO.getLevelValue())) {meetingBO.setDurationLevel(levelBO.getRtCode());//持久化等级到相应的表break;}
}

java判断某个数值是否在一个数值区间内相关推荐

  1. JAVA判断一个地理坐标是否在一个多边形区域内和是否在一个圆形区域内(经纬度)

    怎么样判断一个坐标点在一个多边形区域内?包括规则多边形,不规则多边形,还有圆... 1 判断一个坐标是否在圆形区域内? 多边形和圆分开写,首先简单的就是判断是否在圆里面,如何判断一个坐标是否在圆形区域 ...

  2. Java 判断一个点是否在一个三角形内

    题目描述:   如何判断一个点是否在一个三角形内. 测试样例: 自定义的POINT类: class POINT{int x;int y;public POINT(int x,int y){this.x ...

  3. java 判断范围_java判断一个点是否在一个围栏范围内

    应项目需求,需要判断一个点所属哪个区域范围内管辖,突然想起来三年前做了个外卖的项目里面有个功能,判断用户是否在商家自己划的配送范围内,又找回来以前的代码来看了下,所以在此处记录一下 @Data @No ...

  4. java判断地图范围_百度地图java 判断当前位置是否在多边形区域内

    package com.haiyisoft.cAssistant.adapter.hessian; import java.awt.geom.Point2D; import java.util.Arr ...

  5. 微信小程序 - 判断一个经纬度是否在一个多边形区域内

    功能描述: 最近公司做了一个定位打卡的小程序,需要判断用户的经纬度是否在一个闭合的多边形区域内,在区域内允许打卡,否则提示"不再打卡范围".由于腾讯地图小程序SDK没有提供相关功能 ...

  6. Java 判断一个点是否在一个多边形内

    工具类 提供:监测点的X轴.Y轴.多边形的多个坐标.如果存在多边形里面返回true,反之返回false import java.awt.geom.Point2D; import java.awt.ge ...

  7. linux 循环一段ip区间,Shell脚本实现判断IP地址是否在一个ip段内代码分享

    cat ipcalc.sh #!/bin/bash IP=$1 if [ -z $IP ] then echo -e "\e[31;42m sh ipcalc.sh IP \e[0m&quo ...

  8. JAVA判断数字是否在指定开闭区间内

    import javax.script.ScriptEngine; import javax.script.ScriptEngineManager;public class IntervalUtil ...

  9. Java判断经纬度点是否在给定区域内

    1.经纬度类 package com.example.demo.util;import lombok.AllArgsConstructor; import lombok.Builder; import ...

最新文章

  1. 使用OpenCV-Python的函数minMaxLoc()应该注意的两点
  2. 深度解读:都是顶薪为什么浓眉远超卡哇伊?
  3. pandas 取excel 中的某一列_Excel快速分表(xlwings+pandas)
  4. 知识图谱最新权威综述论文解读:开篇部分
  5. PyTorch学习(8)-问答系统、文本摘要和大规模预训练语言模型
  6. Deep Learning基础--Softmax求导过程
  7. Host localhost is not allowed to connect to mysql server解决方法
  8. Centos中如何配置Texlive2013中文字体的问题
  9. dw1820网卡支持linux吗,黑苹果驱动DW1820A无线网卡教程
  10. 网络编程在线英英词典之注册模块实现(三)
  11. 对区块链技术的一些思考
  12. 常用LDO低压差线性稳压芯片封装型号以及基本电路
  13. 制度罚则-- 线下Bug规范
  14. Spark 连接kafka报错: Error while fetching metadata with correlation id xx [topicName=INVALID_REPLICATIO]
  15. 简单 黑苹果dsdt教程_[黑苹果入门]关于DSDT的入门知识
  16. C++中的模板及其使用
  17. android /linux休眠与唤醒(一)
  18. [52PJ] Java面向对象笔记(转自52 1510988116)
  19. SpringMVC 406
  20. 【嵌入式】STM32基于SPI通信协议OLED屏显示

热门文章

  1. 天气数据采集微服务的实现:数据采集组件、数据存储组件
  2. Tmall爬虫实战记录
  3. 聊一聊缓存 [from memory cache 和 from disk cache]
  4. 屁大点事之idea插入上/下空行快捷键
  5. 【观察】打造中国基础软件新名片,星环科技创新与超越之路
  6. LINUX设备驱动程序第三版.pdf,linux设备驱动程序第3版.pdf免费下载链接,学习资源下载
  7. HF-Net初探之一:简介与配置使用
  8. 一招搞定多Offer选择
  9. 没有美术基础如何学?月薪过万建模大佬的八字真言
  10. 微软AppLocale的严重bug,及解决方法『综合各帖』