diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/lang/range/FiniteBound.java b/hutool-core/src/main/java/cn/hutool/v7/core/lang/range/FiniteBound.java index 2fbe5c5309..e8ec3221e0 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/lang/range/FiniteBound.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/lang/range/FiniteBound.java @@ -200,8 +200,14 @@ class FiniteBound> implements Bound { if (bt1 == bt2) { return 0; } - // 一为左边界,一为右边界,则左边界恒在右边界后 + // 一为左边界,一为右边界 if (bt1.isDislocated(bt2)) { + // 特殊情况:右闭区间与左闭区间在同一点时,认为它们重合(用于区间相交判断) + if ((bt1 == BoundType.CLOSE_UPPER_BOUND && bt2 == BoundType.CLOSE_LOWER_BOUND) || + (bt1 == BoundType.CLOSE_LOWER_BOUND && bt2 == BoundType.CLOSE_UPPER_BOUND)) { + return 0; + } + // 一般情况:左边界恒在右边界后 return bt1.isLowerBound() ? 1 : -1; } // 都为左边界,则封闭边界在前,若都为右边界,则封闭边界在后 diff --git a/hutool-core/src/test/java/cn/hutool/v7/core/lang/range/BoundTest.java b/hutool-core/src/test/java/cn/hutool/v7/core/lang/range/BoundTest.java index b400a0476e..6e69865661 100644 --- a/hutool-core/src/test/java/cn/hutool/v7/core/lang/range/BoundTest.java +++ b/hutool-core/src/test/java/cn/hutool/v7/core/lang/range/BoundTest.java @@ -17,14 +17,28 @@ package cn.hutool.v7.core.lang.range; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + /** * test for {@link Bound} */ @SuppressWarnings("EqualsWithItself") public class BoundTest { + @Test + @DisplayName("测试相邻区间合并") + void testUnionIfIntersectedWithAdjacentRanges() { + BoundedRange range1 = BoundedRange.close(1, 3); + BoundedRange range2 = BoundedRange.close(3, 5); + BoundedRange result = BoundedRangeOperation.unionIfIntersected(range1, range2); + + assertEquals(Bound.atLeast(1), result.getLowerBound()); + assertEquals(Bound.atMost(5), result.getUpperBound()); + } + @Test public void testEquals() { final Bound bound = new FiniteBound<>(1, BoundType.OPEN_UPPER_BOUND);