如何计算 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
小于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]
。
以下应该有效,其中 a
和 b
是您的两个范围。
if (aMin <= bMax && aMax >= bMax ||
bMin <= aMax && bMax >= aMax)
{
// OVERLAP
}
开始思考相反的问题:两个区间,在数学上可以描述为 [amin, amax]
和 [bmin, bmax]
,不重叠当且仅当 (amin > bmax OR bmin > amax)
.
因此,通过布尔表达式的简单否定,当且仅当:(amin <= bmax AND bmin <= amax)
.
我有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
小于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]
。
以下应该有效,其中 a
和 b
是您的两个范围。
if (aMin <= bMax && aMax >= bMax ||
bMin <= aMax && bMax >= aMax)
{
// OVERLAP
}
开始思考相反的问题:两个区间,在数学上可以描述为 [amin, amax]
和 [bmin, bmax]
,不重叠当且仅当 (amin > bmax OR bmin > amax)
.
因此,通过布尔表达式的简单否定,当且仅当:(amin <= bmax AND bmin <= amax)
.