如何计算 Java 中 2 个整数范围之间是否存在交集

How to calculate if there is intersection between 2 ranges of ints in Java

我有2个最大值和最小值,例如:

22 ------ 26 and 16 ------ 22 (OK, because of 22)
22 ------ 26 and 10 ------ 12 (FAILS)
22 ------ 30 and 29 ------ 33 (OK because of 29 and 30)

我想知道 Java 中表示最大值和最小值的集合之间是否存在交集。

我试图在论文中做到这一点,并得到了一个带有 4 个测试的 if,但我发现它们失败了:

if ((thisEntityLeftPosX <= anotherEntityLeftPosX && thisEntityRightPosX >= anotherEntityRightPosX)
            || (thisEntityLeftPosX >= anotherEntityLeftPosX && thisEntityRightPosX >= anotherEntityRightPosX)
            || (thisEntityLeftPosX <= anotherEntityLeftPosX && thisEntityRightPosX <= anotherEntityRightPosX)
            || (thisEntityLeftPosX >= anotherEntityLeftPosX && thisEntityRightPosX >= anotherEntityRightPosX)) {

也许有更简单的方法。

不是重复的,因为这不是关于集合中包含的数字,而是关于集合的交集。

只需使用 min/max :

如果以下条件为真 - 它们相交

maxA < minB || maxB < minA

您可以按照以下方式进行:

int left = Math.max(thisEntityLeftPosX,anotherEntityLeftPosX);
int right = Math.min(thisEntityRightPosX,anotherEntityRightPosX);
if(left <= right) {
    //overlap
} else {
    //don't overlap
}

jDoodle demo with your sample input

我们的想法是计算某种交集:交集从给定两个中的最后一个开始;并以两者中的最小值结束。如果 left 因此小于或等于 right.

,则交集中有元素

此程序假设 thisEntityLeftPosX 小于thisEntityRightPosXanother...也是如此。以防假设不成立。您可以将代码修改为:

int temp;
if(thisEntityLeftPosX > thisEntityRightPosX) {
    temp = thisEntityLeftPosX;
    thisEntityLeftPosX = thisEntityRightPosX;
    thisEntityRightPosX = temp;
}
if(anotherEntityLeftPosX > anotherEntityRightPosX) {
    temp = anotherEntityLeftPosX;
    anotherEntityLeftPosX = anotherEntityRightPosX;
    anotherEntityRightPosX = temp;
}
int left = Math.max(thisEntityLeftPosX,anotherEntityLeftPosX);
int right = Math.min(thisEntityRightPosX,anotherEntityRightPosX);
if(left <= right) {
    //overlap
} else {
    //don't overlap
}

一个可能的附加条件是,如果范围相交,您就立即构建了相交的范围。对于 [22;30][29;33],这会生成新的范围 [left;right]=[29;33]

以下应该有效,其中 ab 是您的两个范围。

if (aMin <= bMax && aMax >= bMax ||
    bMin <= aMax && bMax >= aMax)
{
    // OVERLAP
}

开始思考相反的问题:两个区间,在数学上可以描述为 [amin, amax][bmin, bmax],不重叠当且仅当 (amin > bmax OR bmin > amax).

因此,通过布尔表达式的简单否定,当且仅当:(amin <= bmax AND bmin <= amax).