`
song_shier
  • 浏览: 9665 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java数字区间重叠校验

    博客分类:
  • java
阅读更多

一、    设计背景

在具体的软件开发过程中可能会涉及到用两个数字表示一定的数字区间范围,或者是一个数字,另一个数字是无穷大或者是无穷小的数字区间范围。其实,总结起来共有8种类型的数字区间,它们是:1、左闭,右边为无穷大的区间;2、右闭,左边为无穷小的区间;3、左开,右边为无穷大的区间;4、右开,左边为无穷小的区间;5、左闭右闭区间;6、左闭右开区间;7、左开右闭区间;8、左开右开区间。在实际应用中往往要保证客户端输入的这些区间不能有相交的情况,并且,针对以上的8种情况的数字区间,任意拿出一种和其它任意一种去判断是否相交,程序逻辑都是不同的。那么这样要是按照面向过程的开发思想从头到尾的将程序写下去会很困难,往往还将程序写错了,写错之后差错比较困难,而且日后的维护工作量都不小。

二、    设计思想

如下类图所示:

 

针对上面分析出来的开发困难,在实际的开发中,我们可以将两个数字表示一定的数字区间范围,或者是一个数字,另一个数字是无穷大或者是无穷小的数字区间范围,都统一的看成一个对象,当然对象是隶属于类的,那么我们就写一个抽象的父类AbstractDigitalRange,因为有8种类型的数字区间,故可以写8个实现类。那么我们分析这8个具体的实现类以及它们的父类应该有什么样的属性和行为呢?

1、              针对属性:

1)、至少应该有表示区间左边端点的属性leftDigital(左边为无穷小的区间的此属性值为null);

2)、至少应该有表示区间右边端点的属性rightDigital(右边为无穷大的区间的此属性值为null);

3)、至少应该有标志此区间类型的属性type,可以将其属性值定为:1代表左闭,右边为无穷大的区间;

2代表右闭,左边为无穷小的区间;

3代表左开,右边为无穷大的区间;

4代表右开,左边为无穷小的区间;

5代表左闭右闭区间;

6代表左闭右开区间;

7代表左开右闭区间;

8代表左开右开区间。

2、              针对行为方法:

1)、得到数字区间的类型的方法getType、得到左边端点的数字的方法getLeftDigital、得到右边端点的数字的方法getRightDigital

2)、各个实现类的构造器,构造其中要因类的不同,将志此区间类型的属性赋值为某个值,以及某些类中不需要设置左边端点或者是右边端点(因为这些类中这个端点值为null),这里不再赘述;

3)、至少应该有判断一个实点数字是否本区间内,在则返回true,否则返回false的方法public boolean isInThisRange(Double digital),实点数字就是数轴上标实际点的数字,相对于标“圈”的虚点数字,当然具体的实现类里面的实现逻辑是不同的;

4)、至少应该有根据指定的邻域趋向,判断判断一个虚点数字,和是否本区间内,在则返回true,否则返回falsepublic boolean isInThisRange(Double digital, int neightbourThend),虚点数字就是数轴上标 “圈”的数字,同时在这里我们为了我们的程序起见,认为虚点数字其真正意义是表示它左方向、或者右方向上的无限接近这个点的邻域的数字(对于判断无穷大的点,可以传入null值,邻域趋向为左方向,表示从左边无限接近无穷大,判断无穷小的点,可以传入null值,邻域趋向为右方向,表示从右边无限接近无穷小),当然具体的实现类里面的实现逻辑是不同的;

5)、至少应该有判断一个指定的数字区间的两个端点是否有一个在本区间内,如果有则返回true,否则返回false的方法public boolean isInThisRange(AbstractDigitalRange digitalRange),其具体实现过程可以根据指定的数字区间的类型,分别调用本类的“判断一个实点数字是否本区间内”的方法public boolean isInThisRange(Double digital),或者调用“根据指定的邻域趋向,判断判断一个虚点数字,和是否本区间内”的方法public boolean isInThisRange(Double digital, int neightbourThend)判断两个端点是否在本区间内。如果一个数字区间的两个端点有一个在本区间内,变相的说明指定的数字区间和本区间相交。

6)、至少应该有判断一个数字区间是否和本区间有交集,有则返回true,没有返回false的方法public boolean isCrossAndThis(AbstractDigitalRange digitalRange)。在具体的实现类中判断一个区间是否和本区间有交集的方法中,大致可以先判断这个区间的两个端点是否有一个在本区间内,然后再调用另一个区间的判断数字区间的两个端点是否有一个在这个区间内的方法digitalRange. isInThisRange(this),将本区间传入,这样两个方法都返回false,则确定没有交集。

那么在具体应用中,判断两个区间是否相交,就可以将两个区间分别做成上面提到的具体实现类的对象,然后调用其中一个对象的“判断一个数字区间是否和本区间有交集”的方法public boolean isCrossAndThis(AbstractDigitalRange digitalRange)即可。这样根据上面的叙述,是不是将两个区间正常相交、两个区间完全重合、一个区间在另一个区间之中等等情况判断出来了。

同理对于多个区间之间判断任意两个是否相交,就可以将多个区间分别做成具体实现类的对象,然后可以放到List中去,遍历List,拿出一个对象和其中任意对象进行判断是否相交即可

三、    具体的java

描述

名称

此类是表示数轴上两个数字之间的数字区间的最顶层抽象父类。

org. digitalrange.AbstractDigitalRange

此类是左闭右开区间的对象化表达方式

org. digitalrange.LeftCloseRightOpenDigitalRange

此类是左开右闭区间的对象化表达方式

org. digitalrange.LeftOpenRightCloseDigitalRange

此类是左闭右闭区间的对象化表达方式

org. digitalrange.LeftCloseRightCloseDigitalRange

此类是左闭,右边为无穷大的区间的对象化表达方式

org. digitalrange.LeftCloseDigitalRange

此类是右闭,左边为无穷小的区间的对象化表达方式

org. digitalrange.RightCloseDigitalRange

此类是左开,右边为无穷大的区间的对象化表达方式

org. digitalrange.LeftOpenDigitalRange

此类是左开右开区间的对象化表达方式

org. digitalrange.LeftOpenRightOpenDigitalRange

此类是右开,左边为无穷小的区间的对象化表达方式

org. digitalrange.RightOpenDigitalRange

四、  Java类的具体描述

org. digitalrange.AbstractDigitalRange

表示数轴上两个数字之间的数字区间的最顶层抽象父类

 

具体描述:

此类是表示数轴上两个数字之间的数字区间的最顶层抽象父类,这个类和其子类是数轴上两个数字之间的数字区间的对象化表达方式。用type属性表示区间的类型。对于右边为无穷大的区间rightDigital属性为null,左边为无穷小的区间的leftDigital属性为null

同时这个类提供判断一个数字是否本区间内的抽象方法;提供判断一个区间是否和本区间有交集的抽象方法;提供判断数字区间的两个端点是否有一个在本区间内的抽象方法。

那么在具体的实现类中判断一个区间是否和本区间有交集的方法中,大致可以先判断这个区间的两个端点是否有一个在本区间内,然后再调用另一个区间的判断数字区间的两个端点是否有一个在这个区间内的方法,将本区间传入,这样两个方法都返回false,则确定没有交集。

方法:

public int getType()public Double getLeftDigital()public Double getRightDigital()public boolean isInThisRange(Double digital)public boolean isInThisRange(Double digital, int neightbourThend)public boolean isInThisRange(AbstractDigitalRange digitalRange)public boolean isCrossAndThis(AbstractDigitalRange digitalRange)

org. digitalrange.LeftCloseRightOpenDigitalRange

左闭右开区间的对象化表达方式,此类继承org. digitalrange.AbstractDigitalRange

具体描述:

此类是左闭右开区间的对象化表达方式,构造器中要将type属性赋值为6

org. digitalrange.LeftOpenRightCloseDigitalRange

左开右闭区间的对象化表达方式,此类继承org. digitalrange.AbstractDigitalRange

具体描述:

此类是左开右闭区间的对象化表达方式,构造器中要将type属性赋值为7

org. digitalrange.LeftCloseRightCloseDigitalRange

左闭右闭区间的对象化表达方式,此类继承org. digitalrange.AbstractDigitalRange

具体描述:

此类是左闭右闭区间的对象化表达方式,构造器中要将type属性赋值为

org. digitalrange.LeftCloseDigitalRange

左闭,右边为无穷大的区间的对象化表达方式,此类继承org. digitalrange.AbstractDigitalRange

具体描述:

此类是左闭,右边为无穷大的区间的对象化表达方式,构造器中要将type属性赋值为1

org. digitalrange.RightCloseDigitalRange

右闭,左边为无穷小的区间的对象化表达方式,此类继承org. digitalrange.AbstractDigitalRange

具体描述:

此类是右闭,左边为无穷小的区间的对象化表达方式,构造器中要将type属性赋值为2

org. digitalrange.LeftOpenDigitalRange

左开,右边为无穷大的区间的对象化表达方式,此类继承org. digitalrange.AbstractDigitalRange

具体描述:

此类是左开,右边为无穷大的区间的对象化表达方式,构造器中要将type属性赋值为3

org. digitalrange.LeftOpenRightOpenDigitalRange

左开右开区间的对象化表达方式,此类继承org. digitalrange.AbstractDigitalRange

具体描述:

此类是左开右开区间的对象化表达方式,构造器中要将type属性赋值为8

org. digitalrange.RightOpenDigitalRange

右开,左边为无穷小的区间的对象化表达方式,此类继承org. digitalrange.AbstractDigitalRange

具体描述:

此类是右开,左边为无穷小的区间的对象化表达方式,构造器中要将type属性赋值为4

 

分享到:
评论
1 楼 panxin 2017-11-23  
 AbstractDigitalRange digitalRange1=new LeftOpenRightOpenDigitalRange(16D,20D);
 AbstractDigitalRange digitalRange2=new LeftOpenRightOpenDigitalRange(20D,25D);


16<=X<=20  20<=X<=25  
这样 数字20  应该是重叠的;



//digitalRange是左开右开区间
			case 8: {
				boolean leftDigitalBoo=this.isInThisRange(digitalRange.getLeftDigital(),1);
				boolean rightDigitalBoo=this.isInThisRange(digitalRange.getRightDigital(),0);
				return leftDigitalBoo||rightDigitalBoo;
				}


改为

//digitalRange是左开右开区间
			case 8: {
				boolean leftDigitalBoo=this.isInThisRange(digitalRange.getLeftDigital(),2);
				boolean rightDigitalBoo=this.isInThisRange(digitalRange.getRightDigital(),0);
				return leftDigitalBoo||rightDigitalBoo;
				}

相关推荐

    表单校验时间段重叠问题

    有个统计时段的字段,需排除选择的时间范围不能与已有时间段重叠

    重叠区间查找算法实现(C++)

    重叠区间查找算法是一种在计算机科学中用于处理和查找数据集中的重叠时间段的问题。这种算法在各种领域都有应用,例如日程管理、资源调度、生物信息学等。在这个C++实现的课程设计中,我们将深入探讨重叠区间查找...

    java 判断两个时间段是否重叠的案例.docx

    "java 判断两个时间段是否重叠的案例" 本文主要介绍了如何在 Java 中判断两个时间段是否重叠的案例。时间段是指具有起始时间和终止时间的时间范围,在实际开发中,我们经常需要判断两个时间段是否存在重叠的情况。...

    区间树上重叠区间查找

    区间树上重叠区间查找 本次试验是在红黑树的基础上扩展数据结构

    区间重叠相关题目1

    区间重叠相关题目主要涉及到如何计算和处理在特定场景下多个区间之间的相互覆盖情况,例如聚会中的最大同时参与人数或是寻找一维坐标轴上最长重叠的区间段。这类问题通常可以通过排序和计数的方法解决。 一、最大...

    区间树上的重叠区间查找算法源代码和实验报告

    特别是在查找具有特定区间重叠的区间时,区间树能够以对数时间复杂度快速响应,相较于其他线性或基于排序的查询方法,具有明显的效率优势。本文将深入探讨区间树上的重叠区间查找算法的原理、源代码实现及性能评估,...

    java多张图片重叠。包括透明图片

    这个例子展示了如何使用Java处理图像的重叠,特别是处理具有透明度的PNG图像。通过调整图像的位置和大小,可以创建各种各样的视觉效果。在实际应用中,可能还需要考虑其他因素,如旋转、剪裁、颜色空间转换等。理解...

    区间树的重叠区间查找算法

    算法导论,在红黑树的基础上扩张出区间树的数据结构,并且构造区间树的重叠区间查找算法。

    基于WiFi信号的整体区间重叠度的AP选取算法.docx

    基于WiFi信号的整体区间重叠度的AP选取算法 WiFi 指纹室内定位技术是未来人工智能的核心技术之一,开发有效稳定的室内定位技术是工业与学术界的研究热点。基于 RSSI 的 WiFi 室内定位技术在定位精度、定位效率与...

    最大重叠区间个数–java实现

    (1)定义了新的Comparator接口,使之能正确针对左闭右开区间进行排序 (2)原文中的Point类对应于本文的Interval类,删除类原文中的Interval类 (3)增加了控制台的输入和输出 (4)原文中count初始值为1,本文中...

    JAVA按钮的移动不重叠

    "JAVA按钮的移动不重叠"这个主题涉及到如何在GUI中动态调整多个按钮的位置,以确保它们在移动时不会重叠或相交。这通常涉及到组件布局管理、事件监听以及可能的自定义绘图。 1. **组件布局管理**: Java提供了多种...

    SuperMap iObjects Java 8C 批量去除面对象重叠区域

    本范例,"SuperMap iObjects Java 8C 批量去除面对象重叠区域",就是针对这一问题提供了解决方案。SuperMap iObjects是SuperMap公司开发的一套GIS核心组件,支持多种编程语言,Java 8C版本则专门针对Java平台。 1. ...

    java 判断两个时间段是否重叠的案例

    Java 判断两个时间段是否重叠的案例 在 Java 中,判断两个时间段是否重叠是一种常见的需求,特别是在业务逻辑中需要检查时间段的交叉情况时。在本文中,我们将介绍如何使用 Java 判断两个时间段是否重叠,并提供...

    在matlab中连续区间 交集 和 并集

    例如,它可能具有检查区间是否相交、分割区间、合并重叠区间等附加功能。 在实际应用中,这些函数可能会利用MATLAB的内建函数,如`sort`用于排序区间,`ismember`用于判断元素是否在区间内,以及`diff`检测区间的...

    数字信号MATLAB重叠相加.rar_matlab信号相加_平滑信号_重叠相加_重叠相加 matlab_音频滤波

    数字信号处理,重叠相加法对输入的音频信号进行平滑滤波。

    NC打印后面数字重叠压住前面字

    ### NC打印后面数字重叠压住前面字的问题分析与解决方案 #### 问题背景 在进行NC(Numerical Control,数控)打印操作时,遇到了一个较为常见的问题:后面打印的数字会重叠并压住前面已经打印的文字或数字,导致...

    区间树上重叠区间查找算法.doc

    区间树上重叠区间查找算法.doc

    FOURIER重叠数字滤波器

    标题:"FOURIER重叠数字滤波器"与描述:"本文详细地介绍了FOURIER重叠数字滤波器。"共同指向了一种先进的信号处理技术——FOURIER重叠数字滤波器,这是一种利用离散傅立叶变换(DFT)进行信号处理的创新性滤波器设计...

    Java调用Zebra条码打印机打印条码、中英文数字条码混合标签(2)

    本文将深入探讨如何使用Java语言调用Zebra条码打印机打印条码和包含中英文数字的混合标签。Zebra作为知名的条码打印机制造商,其提供的ZPL(Zebra Programming Language)是一种强大的指令集,用于控制打印机进行...

Global site tag (gtag.js) - Google Analytics