背景

在项目中需要存储区间值数据,并进行重复区间判断。终于找到一种有用的方案,特此记录一下,以防不备之需。

取值范围符号包括:

  • 7-全闭区间
  • 8-左闭右开区间
  • 9-左开右闭区间
  • 10-全开区间

下图为实际应用场景:

实现代码如下:

工具类

public class SectionUtil {//最小值private String min_entity;//最大值private String max_entity;//左侧括号状态:false -开区间  true-- 闭区间private boolean left_sate = false;//右侧括号状态:false -开区间  true-- 闭区间private boolean right_sate = false;private SectionUtil() {}public SectionUtil(String min_entity, String max_entity, boolean left_sate, boolean right_sate) {this.min_entity = min_entity;this.max_entity = max_entity;this.left_sate = left_sate;this.right_sate = right_sate;}private String getMin_entity() {return min_entity;}private String getMax_entity() {return max_entity;}private boolean isLeft_sate() {return left_sate;}private boolean isRight_sate() {return right_sate;}/*** @description: 创建负区间((负无穷,X])* @param value 区间最大值* @param right_sate 区间开闭状态*/private static SectionUtil creatFu(String value, boolean right_sate) {return new SectionUtil("", value, false, right_sate);}/*** @description: 创建正区间[X,正无穷))* @param value 区间最小值* @param left_sate 区间开闭状态*/private static SectionUtil creatZheng(String value, boolean left_sate) {return new SectionUtil(value, "", left_sate, false);}/*** @description: 创建闭合区间([X,Y])* @param min   区间最小值* @param max   区间最大值* @param left_sate 区间左侧开闭状态* @param right_sate 区间右侧开闭状态* @return*/private static SectionUtil creat(String min, boolean left_sate, String max, boolean right_sate) {return new SectionUtil(min, max, left_sate, right_sate);}/*** @description:  将实体类转换成区间集合* @param record  待转换的实体类* @return 转换后的区间集合类(不等于时转换后为2个区间,所以采用集合)*/private static List<SectionUtil> getSections(RepeatIntervalVO record) {List<SectionUtil> list = new ArrayList<>();String record_max = record.getMaxValue();String record_min = record.getMinValue();switch (record.getSymbol()) {case 1:list.add(creatZheng(record_max, false));break;case 2:list.add(creatFu(record_max, false));break;case 3:list.add(creat(record_max, true, record_max, true));break;case 4:list.add(creatFu(record_max, false));list.add(creatZheng(record_max, false));break;case 5:list.add(creatZheng(record_max, true));break;case 6:list.add(creatFu(record_max, true));break;case 7:list.add(creat(record_min, true, record_max, true));break;case 8:list.add(creat(record_min, true, record_max, false));break;case 9:list.add(creat(record_min, false, record_max, true));break;case 10:list.add(creat(record_min, false, record_max, false));break;}return list;}private int compareTo(String first_value, String second_value) {//first_value为空表示为正无穷,second_value为空表示为负无穷if (isBlank(first_value) || isBlank(second_value)) {return 1;}return compareToValue(first_value,second_value);}//判断字符串是否为空private static boolean isBlank(String str) {int strLen;if (str == null || (strLen = str.length()) == 0) {return true;}for (int i = 0; i < strLen; i++) {if ((Character.isWhitespace(str.charAt(i)) == false)) {return false;}}return true;}/*** @param record 判断区间是否有重合* @return true-有重合  false -无重合* @description: 判断当前区间是否和指定区间重合*/private boolean isChonghe(SectionUtil record) {String min_entity = record.getMin_entity();String max_entity = record.getMax_entity();boolean left_sate = record.isLeft_sate();boolean right_sate = record.isRight_sate();boolean left_isok = false;boolean right_isok = false;//重合条件,第一个区间最大值大于第二个区间最小值并且第一个区间的最小值小于第二个区间的最大值//注意传值顺序,第一个值为第一个区间的最大值(此处不能反)int first_result = compareTo(this.max_entity, min_entity);if ((first_result == 0 && this.right_sate && left_sate) || (first_result > 0)) {left_isok = true;}//注意传值顺序,第一个值为第二个区间的最大值(此处不能反)int second_result = compareTo(max_entity, this.min_entity);//此处本应该是second_result<0,但由于上一步参数传递时时反正传递,故此此处为second_result>0if ((second_result == 0 && this.left_sate && right_sate) || second_result > 0) {right_isok = true;}return left_isok && right_isok;}/*** @description:   比较集合中区间是否有重叠* @param list1 待比较集合1* @param list2 待比较集合2* @return*/private static boolean isChonghe(List<SectionUtil> list1, List<SectionUtil> list2) {boolean chonghed = false;for (SectionUtil item1 : list1) {for (SectionUtil item2 : list2) {chonghed = item1.isChonghe(item2);if (chonghed) {return true;}}}return chonghed;}//比较大小private static int compareToValue(String value1, String value2) {BigDecimal b1 = new BigDecimal(value1);BigDecimal b2 = new BigDecimal(value2);return b1.compareTo(b2);}/*** @description:   判断集合中区间是否重叠* @param list  待判断集合* @return  fasle-无重叠 true-有重叠*/public static boolean compareSection(List<RepeatIntervalVO> list) {for (int i = 0; i < list.size(); i++) {RepeatIntervalVO record = list.get(i);for (int j = i + 1; j < list.size(); j++) {RepeatIntervalVO item = list.get(j);//判断区间是否有交叉List<SectionUtil> records = SectionUtil.getSections(record);List<SectionUtil> items = SectionUtil.getSections(item);boolean chonghe = SectionUtil.isChonghe(records, items);if (chonghe) {return true;}}}return false;}
}

实体类对象

public class RepeatIntervalVO implements Serializable{private static final long serialVersionUID = 8328199556034918812L;private String minValue;private String maxValue;//"范围符号:1-大于/2-小于/3-等于/4-不等于/5-大于等于/6-小于等于/7-全闭区间/8-左闭右开区间/9-左开右闭区间/10-全开区间"private Integer symbol;public RepeatIntervalVO(String minValue, String maxValue, Integer symbol) {this.minValue = minValue;this.maxValue = maxValue;this.symbol = symbol;}public String getMinValue() {return minValue;}public void setMinValue(String minValue) {this.minValue = minValue;}public String getMaxValue() {return maxValue;}public void setMaxValue(String maxValue) {this.maxValue = maxValue;}public Integer getSymbol() {return symbol;}public void setSymbol(Integer symbol) {this.symbol = symbol;}
}

测试类:

public class Test {public static void main(String[] args) {List<RepeatIntervalVO> list  = new ArrayList<>();RepeatIntervalVO t = new RepeatIntervalVO("0","10",8);RepeatIntervalVO t2 = new RepeatIntervalVO("10","20",9);RepeatIntervalVO t3 = new RepeatIntervalVO("20","30",8);list.add(t);list.add(t2);list.add(t3);boolean result = SectionUtil.compareSection(list);System.out.println("b = " + result);}
}

总结

通过测试,上述代码可以正确执行。

实际使用时,需要根据自己的需要对实体类的加工。灵活运用,不要硬套上面代码。

参考自:
[1]: https://blog.csdn.net/lingerlan510/article/details/121943855

Java解决校验区间值重复问题相关推荐

  1. springboot 订单重复提交_Spring Boot (一) 校验表单重复提交

    一.前言 在某些情况下,由于网速慢,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现表单数据重复提交造成数据库保存多条重复数据. 存在如上问题可以交给前端解决,判断多长时间内不能再次点 ...

  2. 【正则表达式 】java 正则表达式 校验日期格式

    [正则表达式 ]java 正则表达式 校验日期格式 版权声明:本文为CSDN博主「RanLZ」的原创文章,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/Ran ...

  3. java -- 解决InputStream不可重复读的问题

    作者:opLW 目录 1.InputStream不可重复度 2.解决办法 3.最终方案 1.InputStream不可重复度 问题 最近在使用如下代码解析从网上读取的图片字节流时,遇到一个问题:SkI ...

  4. java 护照校验,Java应用中的数据校验

    翻译:叩丁狼教育吴嘉俊 [译者注:这篇文章是开源项目CUBA Platform的作者,在这篇文章中,作者阐述了CUBA平台中关于数据校验的设计思想和使用方式,可以作为大家在设计数据校验方面一个比较好的 ...

  5. linux获取java环境变量的值,linux获取java环境变量的值

    linux获取java环境变量的值 [2021-02-11 00:17:01]  简介: 服务器 这篇文章主要为大家展示了linux环境下怎么配置环境变量,内容简而易懂,希望大家可以学习一下,学习完之 ...

  6. Java数据校验(Bean Validation / JSR303)

    文档: http://beanvalidation.org/1.1/spec/ API : http://docs.jboss.org/hibernate/beanvalidation/spec/1. ...

  7. 窗口分析函数_2_生成同值重复排名序号

    生成同值重复排名序号 需求描述 需求:将EMP表里的员工按照DEPTNO和SAL字段排序并生成序号.这里相同的SAL则会排名相同. 解决方法:通过RANK OVER()或则@rownum函数来完成. ...

  8. 设计一个名为complex的类来表示复数_complex类java解决

    作者:wzu_cza123 出自:CSDN 原文:blog.csdn.net/wzu_cza123/article/details/108857953?utm_medium=distribute.pc ...

  9. Java 解决跨域问题

    JAVA | Java 解决跨域问题 文章目录 JAVA | Java 解决跨域问题 引言 什么是跨域(CORS) 什么情况会跨域 解决方案 前端解决方案 后端解决方案 具体方式 一.使用Filter ...

最新文章

  1. 手把手带你打造一款 签名设计 的GUI图形界面!
  2. 【算法】学习笔记(1):算法就是人类去教会计算机的方法
  3. 基于Python的开源人脸识别库,离线识别率高达99.38%
  4. Python写数据结构:双向循环链表
  5. 演练:使用 Windows 窗体收集数据
  6. 快手滑块验证码分析 2022/03/17
  7. MMKV_MMKV - 由微信开发的高效,小巧的移动端key-value存储框架,适用于iOS和Android...
  8. SQL 循环语句 while 介绍 实例
  9. KNN分类USPS, USI sonar及USI iris
  10. 民间借贷、网贷vs信用卡
  11. Tomcat网站根目录设置
  12. Unity酱~ 卡通渲染技术分析(一)
  13. 上海海洋大学计算机专硕调剂,2019年上海海洋大学硕士研究生调剂政策和规则...
  14. 大数据--论文读后感
  15. Troubleshooting Consolidation
  16. 转载 2015A国赛优秀论文
  17. 李宏毅 机器学习 2016 秋:5、Classification:Probabilistic Generative Model
  18. 新媒体人必知的KOL投放策略
  19. c语言中文件的只读属性,C/C++ 文件属性设置(隐藏、只读、加密等)(示例代码)
  20. SDF 还能这样用?Cocos Creator 基于 SDF 实现多种 Shader 特效

热门文章

  1. 李煜《浪淘沙令·帘外雨潺潺》赏析
  2. 如何判断远端主机UDP端口是否开启
  3. 了解WEB前端开发吗,风风雨雨30年,前端开发变迁史
  4. css filter blur 白边,CSS3的blur白边怎么去除
  5. 系统项目报表导出功能开发
  6. 【论文review+总结】屏幕内容图像质量评估SC-IQA(Screen Content Image Quality Assessment)
  7. 虚拟物品(游戏)交易平台的设计与实现(Java+SSM+MySQL)
  8. 索马里中国护航船队信息
  9. CodeForces 1397E :Monster Invaders DP
  10. uwb无线定位系统的原理和介绍