查找数字范围交叉点

dec*_*eze 9 math

找出两个数字范围是否相交的最佳方法是什么?

我的号码范围是3023-7430,现在我想测试以下哪个数字范围与它相交:<3000,3000-6000,6000-8000,8000-10000,> 10000.答案应该是3000-60006000-8000.

在任何编程语言中执行此操作的好的,有效的数学方法是什么?

Chr*_*ton 20

只是一个伪代码猜测:

Set<Range> determineIntersectedRanges(Range range, Set<Range> setofRangesToTest)
{
  Set<Range> results;
  foreach (rangeToTest in setofRangesToTest)
  do
    if (rangeToTest.end <range.start) continue; // skip this one, its below our range
    if (rangeToTest.start >range.end) continue; // skip this one, its above our range
    results.add(rangeToTest);
  done
  return results;
}
Run Code Online (Sandbox Code Playgroud)


Han*_*örr 6

我会创建一个Range类,并给它一个方法boolean intersects(Range).然后你可以做一个

foreach(Range r : rangeset) { if (range.intersects(r)) res.add(r) }
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用一些Java 8风格的函数式编程以明确:

rangeset.stream().filter(range::intersects).collect(Collectors.toSet())
Run Code Online (Sandbox Code Playgroud)

交叉路口本身就像

this.start <= other.end && this.end >= other.start
Run Code Online (Sandbox Code Playgroud)