Java 实现区间是否有重叠的方法

其实问一下AI就会给出很好的答案,只是它给出来的答案,验证后有问题,又完善了一下。

步骤分下面几步:

1、判断每个区间,最小和最大是否调转了。

2、根据每个区间开始值排序

3、循环判断上一个的最大值,是否比当前的最小值小。

//1、根据区间开始值 排序
				checkWillcallSurchargeFeeList = checkWillcallSurchargeFeeList.stream().sorted(java.util.Comparator.comparing(WillcallSurchargeFee::getAminWeight,java.util.Comparator.nullsLast(BigDecimal::compareTo))).collect(Collectors.toList());
				checkWillcallSurchargeFeeList.forEach(e->{rangeUnitSet.add(e.getArangeUnit() == null?"":e.getArangeUnit().getAname());});
				
				for(int i=1;i<checkWillcallSurchargeFeeList.size();i++) {
					WillcallSurchargeFee willcallSurchargeFee = checkWillcallSurchargeFeeList.get(i);
					//rangeUnitSet.add(willcallSurchargeFee.getArangeUnit() == null?"":willcallSurchargeFee.getArangeUnit().getAname());
					BigDecimal minNum = willcallSurchargeFee.getAminWeight();
					BigDecimal maxNum = willcallSurchargeFee.getAmaxWeight();
					//2、先判断当前区间,是否有重叠
					if(minNum.compareTo(maxNum) >= 0) {
						flag = false;
						errorinfo.add("初始区间 : " + minNum + " 不能大于或者等于 结束区间 : " + maxNum);
					}
					//3、开始对比两个区间
					WillcallSurchargeFee willcallSurchargeFeeMin = checkWillcallSurchargeFeeList.get(i - 1);
					minNum = willcallSurchargeFeeMin.getAmaxWeight();
					maxNum = willcallSurchargeFee.getAminWeight();
					if(minNum.compareTo(maxNum) > 0) {
						flag = false;
						errorinfo.add("两区间重叠 , 第1区间 [ " + willcallSurchargeFeeMin.getAminWeight() + " 到 " + willcallSurchargeFeeMin.getAmaxWeight()
						+ "] ,第2区间 : [" + willcallSurchargeFee.getAminWeight() + " 到 " + willcallSurchargeFee.getAmaxWeight() + " ]");
					}
				}

<think>好的,我现在需要帮用户解决用Java判断两个区间是否重叠的问题。首先,用户提到了他们参考的站内引用,里面有几个示例和思路。我需要仔细看看这些引用中的内容,然后结合用户的需求给出正确的代码实现。 根据引用[1],判断两个区间是否重叠的条件是max(A.left, B.left) <= min(A.right, B.right)。也就是说,如果两个区间的起始点的最大值小于等于结束点的最小值,那么它们就有重叠。反之,如果max(A.left, B.left) > min(A.right, B.right),则不重叠。这个条件应该能覆盖所有可能的重叠情况,比如部分重叠、完全包含等。 用户需要的是Java代码实现,所以我得考虑如何将这个条件转化成具体的代码。首先,区间的表示方式应该是一个包含两个整数的数组,或者是一个包含起始和结束的对象。根据引用中的示例代码,用户可能更倾向于使用数组,比如int[],其中第一个元素是区间的左端点,第二个是右端点。 接下来,我需要编写一个方法,接收两个区间数组作为参数,然后返回一个布尔值表示是否重叠方法的逻辑就是比较两个区间的左端点最大值和右端点的最小值。如果最大值小于等于最小值,就返回true,否则返回false。 需要注意的是,区间的闭合性。如果区间是闭区间,即包含端点,那么判断条件应该是<=;如果是开区间,比如前闭后开,可能需要调整比较符号为<。但用户提供的引用中的示例使用的是<=,所以这里应该处理的是闭区间的情况。 举个例子,假设区间A是[1,3],区间B是[2,5],那么max(A[0], B[0])是2,min(A[1], B[1])是3,2<=3,所以重叠。另一个例子,区间A[1,3]和B[4,5],max左是4,min右是3,4>3,所以不重叠。 接下来,编写代码时,要确保数组的有效性,比如每个数组长度是否为2,以及起始点是否小于等于结束点。但用户可能假设输入的区间是有效的,所以这里可能不需要做额外的检查。 综上,代码的大体结构应该是这样的: public static boolean isOverlap(int[] A, int[] B) { return Math.max(A[0], B[0]) <= Math.min(A[1], B[1]); } 然后,用户可能需要一些测试用例来验证这个方法的正确性。比如引用中的示例,比如测试三个情况,输出是否正确。 此外,用户可能还需要考虑如何处理不同类型的区间,比如开区间或半开半闭区间,但根据问题描述,用户需求是闭区间的情况,所以暂时不需要扩展这部分。 最后,需要将代码整理清楚,并给出解释,说明这个方法的逻辑和为什么这样可以判断重叠。同时,根据用户的要求,生成相关问题,比如如何扩展到多个区间,或者如何处理开区间的情况等。</think>以下是Java判断两个闭区间是否重叠的代码实现及详细说明: ### Java实现区间重叠判断 ```java public class IntervalOverlapChecker { /** * 判断两个闭区间是否重叠 * @param A 第一个区间,格式为[start, end] * @param B 第二个区间,格式为[start, end] * @return true表示有重叠,false表示无重叠 */ public static boolean isOverlap(int[] A, int[] B) { // 比较两区间的最大左端点和最小右端点 return Math.max(A[0], B[0]) <= Math.min(A[1], B[1]); } // 测试用例 public static void main(String[] args) { System.out.println(isOverlap(new int[]{1,3}, new int[]{2,5})); // true(相交) System.out.println(isOverlap(new int[]{1,3}, new int[]{4,5})); // false(不重叠) System.out.println(isOverlap(new int[]{3,5}, new int[]{4,8})); // true(包含) } } ``` ### 核心逻辑解析 对于闭区间$[a_1,b_1]$和$[a_2,b_2]$,判断重叠的条件为: $$ \max(a_1,a_2) \leq \min(b_1,b_2) $$ 该条件覆盖了所有重叠情况: 1. **相交**:如$[1,3]$与$[2,5]$ 2. **包含**:如$[3,5]$与$[4,8]$ 3. **端点相接**:如$[1,2]$与$[2,3]$(根据闭区间定义属于重叠) ### 测试用例说明 | 测试用例 | 预期结果 | 示意图 | |----------------------|----------|--------------------| | [1,3]与[2,5] | true | 部分重叠 | | [1,3]与[4,5] | false | 完全分离 | | [3,5]与[4,8] | true | 包含关系 | ### 扩展说明 1. **开区间处理**:若为前闭后开区间$(a,b]$,判断条件应改为: $$ \max(a_1,a_2) < \min(b_1,b_2) $$ 2. **多区间判断**:可通过双重循环遍历所有区间对进行判断[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值