区间判断工具类的编写

  • 说明
  • 重点:区间工具类(转载:前行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. 什么是泛型缓存和静态构造函数?
  2. 2016-2017-1 《信息安全系统设计基础》 学生博客及Git@OSC 链接
  3. python面试题及答案bt_公布上期Python笔试题答案,附带源码与运行结果
  4. 武警五防一体化是什么?五防光端机产品介绍!
  5. 2021年财富世界500强,苹果是全球最赚钱公司,小米第338位,第一是它
  6. 的ppt_PPT模板中国风PPT模板
  7. android 多线程 加锁,android 多线程 — 从一个小例子再次品位多线程
  8. MATLAB数值计算
  9. 通用数据权限的设计思路
  10. 使用Fiddler监控雷电/夜神模拟器浏览网页:安全警告:该网站的安全证书有问题.解决方案!
  11. 智能生活 App SDK 开发入门教程
  12. 关于4年工作经验的测试工程师的感想
  13. C# 设计模式:创建型
  14. 射击末世--代理模式
  15. 谷歌八年算法工程师分享几点算法学习小技巧
  16. su组件在什么窗口_su家具组件 SU中的组件与群组有什么不同
  17. 0.96寸OLED液晶显示器
  18. $().ajaxSubmit is not a function解决方案
  19. JQuery渐变色动画效果
  20. nisi安装包 打印日志语法_NSIS 打包脚本基础

热门文章

  1. 查询数据库的表(字段)名和对应的注释
  2. 第一章:操作系统概论
  3. ZNH-IR04工业机器人综合应用实训平台
  4. iZotope Iris 2 for Mac(音频采样合成器)
  5. 与计算机网络相比不属于云计算特征的是,与网络计算机相比,云计算的特征不包括:( )...
  6. 新版标准日本语高级_第21课
  7. 520表白网页,程序员浪漫表白,求婚倒计时网站制作 HTML+CSS+JS
  8. 【基础入门题030】《孙子算经》之鸡兔同笼
  9. 孙子兵法谋攻篇----知胜有五
  10. Python同Java同Js语言语法区别之四判断字符串列表字典是否相等