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

 

你可能感兴趣的:(java)