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

时间:2015-06-05 17:16:30

标签: java intersection

我有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中是否存在代表最大值和最小值的集合之间的交集。

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

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

也许有一种更简单的方法。

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

开始考虑反向问题,两个区间,在数学上,可以描述为[amin,amax]和[bmin,bmax]不重叠iff(amin> bmax或bmin> amax)。因此,通过布尔表达式的简单反转,这些区间重叠iff :( amin <= bmax和bmin&lt; = amax)。

答案 2 :(得分:2)

您可以按照以下方式执行此操作:

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小于thisEntityRightPosX 的假设。同样适用于another...。如果假设不成立。您可以将代码修改为:

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]

答案 3 :(得分:1)

只需使用min / max:

如果后续条件为真 - 他们相交

maxA < minB || maxB < minA