JAVA 比较两个区间是否存在交集

最近遇到一个开发问题,判断两个价格的大小,听着很简单,但其实价格是浮动的,也就是说价格是一个范围,比如物品A的价格是5~10,现在我们通过筛选条件,把价格符合在8~20之前的物品筛选出来,很明显物品A是符合这个筛选条件的,因为它的价格可以说8、9、10,完全符合在8~20的范围内。

此外,该问题还有一个条件,物品A的价格最小可以为0,最大可以为无限大,也就是当物品最大价格为10时,实际范围区间为无限小~10,当物品A最小价格为10时,实际范围区间为10~无限大;筛选条件也同时存在只有最大,只有最小,有最大有最小三种情况。

以上的问题,用代码如何实现呢?

如果按照平常的逻辑,我们需要两层嵌套,外层嵌套式判断筛选的价格情况,是只有最小,只有最大,或者有最小有最大,这三种情况,每一种情况里面又需要对物品的价格三种情况进行区分判断,又是一层嵌套,听着就很麻烦很绕,代码写起来也很冗余。

其实这个问题我们转换一下思路,筛选符合条件价格范围的物品,其实就是求两个区间的交集,回到了数学问题了,只有两个区间有交集,代表符合条件。

讲到区间与交集,要想到用线段来表示,如下图:

线段A1A2、B1B2之间存在交集有以上四种情况,交集的部分分别为以下四条线段

第一:B1A2

第二:A1B2

第三:B1A1

第四:A1B1

我们再来看,这四条线段的起点,也就是B1、A1、B1、A1是怎么得出来的

第一: B1 =  A1与B1 对比后取 其中的最大值

第二: A1 =  B1与A1 对比后取 其中的最大值

第三: B1 =  B1与A1 对比后取 其中的最大值

第三: A1 =  A1与B1 对比后取 其中的最大值

可以看到,起点都是两条线段的起点进行对比后取最大的那个作为起点,同理,交集的终点也是这个道理,只不过是取两条线段的终点进行对比后取最小的那个作为终点。

那么,在java中,我们就可以这么写

交集线段的起点:T1 = Math.max(A1,B1)

交集线段的终点:T2 = Math.min(A2,B2)

也就是说,当T1<T2的时候,就满足条件,因为数轴是从左到右数值递增的,T1>T2,说明终点反而是在起点的前面,这是完全不符合实际情况的,也说明T1>T2的情况是不存在交集的。

以上如果听明白了,那代码就好办了,很简单很简洁,调用以下方法即可以,其中前两个参数第一个区间的起点跟终点,第三第四个参数代表第二个区间的起点跟终点,方法返回true代表有交集符合条件,false则无交集不符合条件

private boolean judge(float a1, float a2, float b1, float b2) {
      if (a1 == 0 && a2 == 0) {
          return false;
      }
      return Math.max(a1, b1) <= Math.min(a2, b2);
}

if的判断,是排除掉,起点即是终点,是零点的情况。

that's all

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值